OWIN之自己动手编写中间件

OWIN系列之自己动手编写中间件

一、前言

   1.基于OWIN的项目摆脱System.Web束缚脱颖而出,轻量级+跨平台,使得ASP.NET应用程序只需依赖这个抽象接口,不用关心所运行的Web服务器。

   2.OWIN.dll介绍

        使用反编译工具打开Owin.dll,你会发现类库中就只有一个IAppBuilder接口,所以说OWIN是针对.NET平台的开放Web接口。

   3.Microsoft.Owin.dll

         Microsoft.Owin.dll是微软对Owin的具体实现,其中就包括我们今天的主题"中间件"。下文将使用代码描述自定义基于Owin的"中间件"。

 

二、环境准备

    1.Visual Studio 2015 Update1

    2.tinyfox-2.3.2-common  --用作Owin Host

 

三、项目基架搭建和介绍

    1.创建一个空的Web站点,移除除了System的所有引用

    2.  使用NuGet命令安装安装Microsoft.Owin

        PM> Install-Package Microsoft.Owin

    3.安装成功后的引用,可以看到,Owin.dll是依赖项,所以自动下载

     

                       图1 所有引用

 

    4.查看Owin.dll结构和IAppBuilder接口代码

  

                                图2 Owin.dll结构

 

  

                                               图3 IAppBuilder接口代码

     5.OwinMiddleware介绍

             OwinMiddleware 是位于Microsoft.Owin.dll中的一个抽象类,我们会用到OwinMiddleware中的Next,简单的说就是当前中间件无法匹配请求则会将请求转向下一个中间件处理,直至成功处理,当然这个取决你的程序中是否有转向代码,下文中将详细介绍。

          

四、自己动手编写中间件

    1.新建类MyMiddleware继承OwinMiddleware并且实现Invoke函数,附代码;在Invoke中根据不同的URL PATH调用不同的处理方法

复制代码
 1     /// <summary>
 2     ///  OWIN "中间件" - MyMiddleware
 3     /// </summary>
 4     public class MyMiddleware : OwinMiddleware
 5     {
 6 
 7 
 8         /// <summary>
 9         /// 构造函数,第一个参数必须为 OwinMiddleware对象 ;第一个参数是固定的,后边还可以添加自定义的其它参数
10         /// </summary>
11         /// <param name="next">下一个中间件</param>
12         public MyMiddleware(OwinMiddleware next)
13             : base(next)
14         {
15            
16         }
17 
18 
19         /// <summary>
20         /// 处理用户请求的具体方法,该方法是必须的
21         /// </summary>
22         /// <param name="c">OwinContext对象</param>
23         /// <returns></returns>
24         public override Task Invoke(IOwinContext c)
25         {
26             if (Next != null && c.Request.Path.Value != "/home/index")
27             {
28 
29                 var message1 = "NotFound\r\n";
30                 var outbytes1 = Encoding.UTF8.GetBytes(message1);
31                 c.Response.ContentType = "text/html; charset=utf-8";
32                 c.Response.Write(outbytes1, 0, outbytes1.Length);
33                 return Next.Invoke(c);
34             }
35 
36             // var urlPath = c.Request.Path;
37             // switch (urlPath) { 
38             //    ..........
39             //    ..........
40             //    可以根据不同的URL PATH调用不同的处理方法
41             //    从而构成一个完整的应用。
42             // }
43 
44 
45             var message = "Welcome to My Home!";
46             var outbytes = Encoding.UTF8.GetBytes(message);
47             c.Response.ContentType = "text/html; charset=utf-8";
48             c.Response.Write(outbytes, 0, outbytes.Length);
49 
50             return Task.FromResult<int>(0);
51         }
52 
53 
54 
55     } 
复制代码

 

介绍:

   1.构造函数第一个参数必须为 OwinMiddleware对象,可从Microsoft.Owin.dll源码得知,这里不作话题。

   2.我们在上面提到了“如果当前中间件无法匹配请求则会将请求转向下一个中间件处理”,上面的代码中的if如果成立,执行returnNext.Invoke(c);后会找注册的下一个中间件,如果url匹配,会正确执行,并且执行return Task.FromResult<int>(0);结束当前请求。

 

2.新建类MyMiddleware2继承OwinMiddleware并且实现Invoke函数,之所以建立两个中间件,是为了演示”如果当前中间件无法匹配请求则会将请求转向下一个中间件处理",同样附上代码

复制代码
 1     /// <summary>
 2     ///  OWIN "中间件" - MyMiddleware2
 3     /// </summary>
 4     public class MyMiddleware2 : OwinMiddleware
 5     {
 6 
 7 
 8         /// <summary>
 9         /// 构造函数,第一个参数必须为 OwinMiddleware对象 ;第一个参数是固定的,后边还可以添加自定义的其它参数
10         /// </summary>
11         /// <param name="next">下一个中间件</param>
12         public MyMiddleware2(OwinMiddleware next)
13             : base(next)
14         {
15         }
16 
17 
18         /// <summary>
19         /// 处理用户请求的具体方法,该方法是必须的
20         /// </summary>
21         /// <param name="c">OwinContext对象</param>
22         /// <returns></returns>
23         public override Task Invoke(IOwinContext c)
24         {
25 
26             if (Next != null && c.Request.Path.Value != "/user")
27             {
28 
29                 var message1 = "NotFound2!\r\n";
30                 var outbytes1 = Encoding.UTF8.GetBytes(message1);
31                 c.Response.ContentType = "text/html; charset=utf-8";
32                 c.Response.Write(outbytes1, 0, outbytes1.Length);
33                 return Task.FromResult(0);
34             }
35 
36             // var urlPath = c.Request.Path;
37             // switch (urlPath) { 
38             //    ..........
39             //    ..........
40             //    可以根据不同的URL PATH调用不同的处理方法
41             //    从而构成一个完整的应用。
42             // }
43 
44 
45             var message = "I'm MyMiddleware2";
46             var outbytes = Encoding.UTF8.GetBytes(message);
47             c.Response.ContentType = "text/html; charset=utf-8";
48             c.Response.Write(outbytes, 0, outbytes.Length);
49 
50             return Task.FromResult<int>(0);
51         }
52 
53 
54 
55     } 
复制代码

 

3.中间件注册类,代码如下:

复制代码
    /// <summary>
    /// 这个类是为AppBuilder添加一个名叫UseMyApp的扩展方法
    /// </summary>
    public static class MyExtension
    {
        public static IAppBuilder UseMyApp(this IAppBuilder builder)
        {
            return builder.Use<MyMiddleware>();
            //UseXXX可以带多个参数,对应中间件构造函数中的第2、3、....参数;
        }
        public static IAppBuilder UseMyApp2(this IAppBuilder builder)
        {
            return builder.Use<MyMiddleware2>();
            //UseXXX可以带多个参数,对应中间件构造函数中的第2、3、....参数;
        }
    }
复制代码

用过第三方Owin框架如Nancyfx的朋友是不是感觉比较熟悉,使用UseXXX()

 

4.注册中间件,新建Startup类

复制代码
 1   public class Startup
 2     {
 3         public void Configuration(IAppBuilder app)
 4         {
 5    
 6             app.UseMyApp();
 7 
 8             app.UseMyApp2();
 9 
10         }
11     }
复制代码

备注:为了达到演示的目的,必须注意注册时的顺序,我们的Next.Invoke(c)是在MyMiddleware中编写的而不是MyMiddleware2 ,所以必须让MyMiddleware先执行,否则在MyMiddleware2  中遇到return Task.FromResult<int>(0);则直接结束当前请求。当然你也可以更换顺序试试,后面会附上源码下载

5.到目前为止,我们的代码已经写好,配置好TinyFox准备测试,如果不知道Tinyfox作为OwinHost如何调试请参考http://www.cnblogs.com/gaobing/p/4969581.html。

五、测试与总结, 并附上测试图

  1.不匹配的url

 

  2.匹配的中间件2的url

 3.匹配中间件1的url


备注:之所以不执行中间件2,是因为成功匹配url,所以直接return Task.FromResult<int>(0);结束当前请求

作者:  jamesbing
提示: 欢迎转载,但是必须保留本文的署名  jamesbing (包含链接)
posted on 2018-08-10 21:50 micwin 阅读( ...) 评论( ...)   编辑 收藏

转载于:https://www.cnblogs.com/chinanetwind/articles/9457596.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。
OWIN(Open Web Interface for .NET)是一个开放的、标准的.NET Web应用程序接口,它允许应用程序自由地选择它们的Web服务器。OWIN 可以与几乎所有 Web 服务器集成,包括 IIS、Apache、Nginx 等。 要在 WinForms 应用程序中使用 OWIN,您需要按照以下步骤操作: 1. 添加 Microsoft.Owin.Host.HttpListener 包。可以使用 NuGet 包管理器来添加该包。 2. 创建一个 OWIN 启动类。这个类必须包含一个名为 Configuration 的方法,它将接收一个 IAppBuilder 对象作为参数。在此方法中,您可以配置 OWIN 中间件和 Web API。 3. 在您的 WinForms 应用程序中创建一个 HttpListener 对象,并将它传递给 OWIN。这样就可以在您的应用程序中运行 OWIN 服务器了。 下面是一个简单的示例,演示如何在 WinForms 应用程序中使用 OWIN: ```csharp using System; using System.Net; using System.Threading.Tasks; using System.Windows.Forms; using Microsoft.Owin.Hosting; namespace WinFormsOWIN { public partial class Form1 : Form { private IDisposable _webApp; public Form1() { InitializeComponent(); } private void btnStart_Click(object sender, EventArgs e) { // 启动 OWIN 服务器 _webApp = WebApp.Start<Startup>("http://localhost:8080"); MessageBox.Show("OWIN 服务器已启动"); } private void btnStop_Click(object sender, EventArgs e) { // 停止 OWIN 服务器 _webApp?.Dispose(); MessageBox.Show("OWIN 服务器已停止"); } } public class Startup { public void Configuration(IAppBuilder app) { // 配置 OWIN 中间件和 Web API app.UseWelcomePage("/"); app.Run(context => { context.Response.ContentType = "text/plain"; return context.Response.WriteAsync("Hello, OWIN!"); }); } } } ``` 在此示例中,我们创建了一个名为 Form1 的 WinForms 窗体,并添加了两个按钮:btnStart 和 btnStop。当用户单击 btnStart 按钮时,我们将启动 OWIN 服务器,并将其绑定到 http://localhost:8080。当用户单击 btnStop 按钮时,我们将关闭 OWIN 服务器。 在 Startup 类中,我们配置了一个简单的 OWIN 中间件来响应根路径(/)的请求,并返回 "Hello, OWIN!"。您可以根据需要添加其他中间件和 Web API。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值