Owin中间件动手做

本文涉及的产品
性能测试 PTS,5000VUM额度
注册配置 MSE Nacos/ZooKeeper,118元/月
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
简介: 摘要:本文目的是了解Owin基本原理。讲述如何从控制台创建一个自宿主的OwinHost,然后再编写一两个中间件准备工作首先通过VisualStudio创建一个控制台应用然后添加Owin的Nuget包引用需要的包如下OwinMicrosoft.

摘要:本文目的是了解Owin基本原理。讲述如何从控制台创建一个自宿主的OwinHost,然后再编写一两个中间件

准备工作

首先通过VisualStudio创建一个控制台应用

然后添加Owin的Nuget包引用

需要的包如下

Owin
Microsoft.Owin
Microsoft.Owin.Hosting
Microsoft.Owin.Host.HttpListener

准备工作到此结束

编写OwinStartup类

public class Startup
{
    public void Configuration(IAppBuilder app)
    {
        app.Run(HandleRequest);
    }
    static Task HandleRequest(IOwinContext context)
    {
        context.Response.ContentType = "text/plain";
        return context.Response.WriteAsync("Hello world from myOwin");
    }
}

当OwinHost运行时,会首先加载Startup类,Configuration方法是必须有的,在Configuration方法中向Owin管道插入中间件,所有的请求都是中间件处理。

在这个Configurationapp.Run(HandleRequest);方法的作用是向管道中添加一个没有后续中间件的中间件,一般来讲一个Owin管道中有许多中间件,不同的中间件处理不同的事情,在处理结束后选择性的调用后面的中间件,例如某个身份验证中间件可以在验证失败时结束请求。而app.Run方法就是插如一个没有后续事项的中间件。稍后我们会编写常规的中间件。

这个中间件做的事很简单,就是向响应写入一个字符串,无论请求是什么结果都是一样的。

在Main方法中启动Host

static void Main(string[] args)
{
    var url = "http://localhost:8080/";
    var opt = new StartOptions(url);

    using (WebApp.Start<Startup>(opt))
    {
        Console.WriteLine("Server run at " + url + " , press Enter to exit.");
        Console.ReadLine();
    }
}

StartOptions类用来指定一些启动参数,最少应该指定一个url,这里一并指定了使用8080端口

启动程序控制台输出如下

Server run at http://localhost:8080/ , press Enter to exit.

用浏览器打开 http://localhost:8080/
效果如下:

`Hello world from myOwin`

尝试更改路径你得到的始终是一个结果
你可以尝试将Configuration中的代码注释掉,在运行程序,这是访问将得到空页面,Http代码也将是404,因为Owin管道中没有中间件处理请求。

编写中间件

我们编写一个名为Ding的中间件

public class DingMiddleware : OwinMiddleware
{
    public DingMiddleware(OwinMiddleware next) : base(next)
    {
    }

    public override Task Invoke(IOwinContext context)
    {
        if (context.Request.Path.Value.Equals("/home/index"))
        {
            context.Response.Write("hello world from home/index");
        }
        if (Next != null)
        {
            return Next.Invoke(context);
        }
        return Task.CompletedTask;
    }
}

这个中间件在检测到访问路径是/home/index时向Response中写入一句话,然后检测是否有下一个中间件,如果有就调用。

添加中间件到Configuration

可以直接在Configuration中加入app.Use<DingMiddleware>()来插入中间件,但是我们一般使用扩展方法来做这件事。

public static class MyMidlewareExtention
{
    public static IAppBuilder UseDing(this IAppBuilder app)
    {
        return app.Use<DingMiddleware>();
    }
}

修改Configuration中的代码:

public void Configuration(IAppBuilder app)
{
    app.UseDing();
    app.Run(HandleRequest);
}

现在管道中有两个中间件了,现在运行程序,在地址栏中输入http://localhost:8080/home/index将得到如下结果
hello world from home/indexHello world from myOwin
因为Ding中间件在处理之后继续调用了接下来的中间件
输入其他路径将得到Hello world from myOwin这个结果

如果将Configuration中的两个中间件位置调换,的到的结果只有一个Hello world from myOwin,因为app.Run(HandleRequest);不执行后续的中间件。

第二个中间件

public class DiDiDiMiddleware : OwinMiddleware
{
    public DiDiDiMiddleware(OwinMiddleware next) : base(next)
    {
    }

    public override Task Invoke(IOwinContext context)
    {
        if (context.Request.QueryString.Value == "boom")
        {
            context.Response.Write("Boom! Boom! Boom!");
            return Task.CompletedTask;
        }
        if (Next != null)
        {
            return Next.Invoke(context);
        }
        return Task.CompletedTask;
    }
}

这个中间件在地址栏QueryString(?后边的部分)等于boom时结束请求。

MyMidlewareExtention代码修改如下:

public static class MyMidlewareExtention
{
    public static IAppBuilder UseDing(this IAppBuilder app)
    {
        return app.Use<DingMiddleware>();
    }
    public static IAppBuilder UseDiDiDi(this IAppBuilder app)
    {
        return app.Use<DiDiDiMiddleware>();
    }
}

Startup类修改如下:

public class Startup
{
    public void Configuration(IAppBuilder app)
    {

        app.UseDiDiDi();
        app.UseDing();
    }
}

这里去掉了app.Run此时,对于非/home/index的请求会得到404,所以我们暂时改动下代码将HandleRequest方法封装成一个默认的中间件

代码改动如下:

public class DefaultMiddleware : OwinMiddleware
{
    public DefaultMiddleware(OwinMiddleware next) : base(next)
    {
    }

    public override Task Invoke(IOwinContext context)
    {
        var path = context.Request.Path.Value;
        context.Response.Write($"hey you come from {path}!");
        return Task.CompletedTask;
    }
}


public class Startup
{
    public void Configuration(IAppBuilder app)
    {
        app.UseDiDiDi();
        app.UseDing();
        app.UseDefault();
    }
}

运行程序观察结果是否符合预期。
当地址中含有?boom时会的到一个Boom!Boom!Boom!

总结:Owin的管道概念其实简单易懂,在程序启动之前,向里面插入中间件,中间件决定请求是否继续向下走。在管道中的中间件可以拿到请求的所有信息以对请求进行处理,管道里的中间件执行结束之后,这个请求就被处理完成了,然后发回浏览器。

目录
相关文章
|
6月前
|
缓存 安全 PHP
【PHP开发专栏】Symfony框架核心组件解析
【4月更文挑战第30天】本文介绍了Symfony框架,一个模块化且高性能的PHP框架,以其可扩展性和灵活性备受开发者青睐。文章分为三部分,首先概述了Symfony的历史、特点和版本。接着,详细解析了HttpFoundation(处理HTTP请求和响应)、Routing(映射HTTP请求到控制器)、DependencyInjection(管理依赖关系)、EventDispatcher(实现事件驱动编程)以及Security(处理安全和认证)等核心组件。
137 3
|
3月前
|
JSON API 数据安全/隐私保护
哇塞!Django REST framework 太逆天啦!构建 API 服务从未如此轻松,你还不来试试?
【8月更文挑战第31天】Django REST framework(DRF)是基于Django框架的高效Web API开发工具,提供序列化、视图集、路由等功能,简化API构建流程。使用DRF可轻松实现数据的序列化与反序列化,并支持权限管理和认证机制以保障API安全。安装DRF只需通过`pip install djangorestframework`命令。要创建基本项目,先安装Django并创建新应用,定义模型、序列化器及视图集,最后配置路由。测试API时,可通过Postman发送HTTP请求验证功能。无论项目大小,DRF均能提供强大支持。
37 0
|
6月前
|
缓存 中间件 PHP
【PHP开发专栏】PHP框架中的路由与中间件
【4月更文挑战第29天】本文探讨了PHP框架中的路由和中间件概念。路由负责将HTTP请求映射到控制器方法,提供灵活的请求处理和URL管理。中间件则是在请求处理前后插入的代码,用于实现如身份验证、日志等功能,与业务逻辑解耦。通过Laravel框架的示例展示了如何定义路由和创建中间件,以实现代码的模块化和可维护性。
80 0
|
6月前
|
消息中间件 开发框架 安全
中间件简析
中间件简析
122 0
|
JSON Java Maven
「造个轮子」——cicada(轻量级 WEB 框架)(上)
俗话说 「不要重复造轮子」,关于是否有必要不再本次讨论范围。 创建这个项目的主要目的还是提升自己,看看和知名类开源项目的差距以及学习优秀的开源方式。 好了,现在着重来谈谈 cicada 这个项目的核心功能。 我把他定义为一个快速、轻量级 WEB 框架;没有过多的依赖,核心 jar 包仅 30KB。 也仅需要一行代码即可启动一个 HTTP 服务。
|
JSON Java 应用服务中间件
「造个轮子」——cicada(轻量级 WEB 框架)(下)
俗话说 「不要重复造轮子」,关于是否有必要不再本次讨论范围。 创建这个项目的主要目的还是提升自己,看看和知名类开源项目的差距以及学习优秀的开源方式。 好了,现在着重来谈谈 cicada 这个项目的核心功能。 我把他定义为一个快速、轻量级 WEB 框架;没有过多的依赖,核心 jar 包仅 30KB。 也仅需要一行代码即可启动一个 HTTP 服务。
|
缓存 iOS开发
iOS网络编程之二——NSURLSession的简单使用
iOS网络编程之二——NSURLSession的简单使用
306 0
|
中间件 监控 C++
OWIN的理解和实践(三) –Middleware开发入门
原文:OWIN的理解和实践(三) –Middleware开发入门 上篇我们谈了Host和Server的建立,但Host和Server无法产出任何有实际意义的内容,真正的内容来自于加载于Server的Middleware,本篇我们就着重介绍下Middleware的开发入门.
1292 0