下一代Asp.net开发规范OWIN(3)—— Middleware

简介:

Middleware是OWIN管道的基本组成单元,最后拼接的OWIN管道来处理客户端请求,输出网页。这篇文章,首先看看Web Form, MVC, Web API如何结合OWIN使用。 然后将如何编写Middleware和编写一个具体的Cache Middleware.

阅读目录:

一. 原有的Web Form, MVC项目如何结合OWIN?

     1.1 通过路由配置,将程序分成多个部分,一些部分由Asp.net Web Form或者MVC处理,另外一部分由OWIN管道处理。
     1.2 在Web Form, MVC之前插入OWIN

二. Web API以Middleware注册到OWIN管道

三. 自定义Cache Middleware

     3.1 HelloWorld Middleware
     3.2 Cache Middleware

四,总结

一,原有的Web Form, MVC项目如何结合OWIN?

坏消息,非常抱歉,尽管OWIN是革命性的,但是Web Form和MVC现在还不能作为一个中间件集成到OWIN管道中。原因在第一篇中Asp.net的历史中有分析过,原因就是Web FormMVC依赖于System.Web.dll中的很多类型。而在OWIN管道中,是无法提供这些依赖的。不过好消息是,在Asp.net vNext中,将会彻底告别System.Web.dll依赖, 那个时候,Asp.net vNext将是集大成者。听说vNext项目组正在和Mono团队一起工作,使得Asp.net vNext开发的项目能够在*nix, osx系统上运行。

那么在当前的情况下,OWIN和Web Form, MVC的结合开发一般是两种形式:

1. 通过路由配置,将程序分成多个部分,一些部分由Asp.net Web Form或者MVC处理,另外一部分由OWIN管道处理。

复制代码
// How to hook OWIN pipelines into the normal Asp.Net route table side by side with other components.
protected void Application_Start(object sender, EventArgs e)
{
     //owin开头的访问路径将会发送到startup.cs初始化的OWIN管道处理
     RouteTable.Routes.MapOwinPath("/owin");
     //special开头的访问路径将会由OwinApp2管道来处理

     RouteTable.Routes.MapOwinPath("/special", app =>
     {
         app.Run(OwinApp2.Invoke);
     });
}
复制代码

如上面代码,在Application_Start函数或者路由配置函数中,分别为/owin路径和/special配置了不同的OWIN管道。
完整的代码,请移步这里http://aspnet.codeplex.com/sourcecontrol/latest#Samples/Katana/AspNetRoutes/Global.asax.cs

2. 在Web Form, MVC之前插入OWIN

在Web Form和MVC项目中,也可以添加Startup.cs, 指定成为OWIN的初始化类型,那么请求会先经过OWIN管道处理,最后转向Web Form或者MVC程序。这种方式,常常用来配置log, authentication, cache等等这些Middleware.

二,Web API以Middleware注册到OWIN管道

Web API由于无任何依赖于System.web.dll, 所以Web API可以作为Middleware注册到OWIN管道中

具体方法如下:

复制代码
  public class Startup
    {
        // Invoked once at startup to configure your application.
        public void Configuration(IAppBuilder builder)
        {
            HttpConfiguration config = new HttpConfiguration();
            config.Routes.MapHttpRoute("Default", "api/{controller}/{customerID}", new { controller = "Customer", customerID = RouteParameter.Optional });//定义web api route
            //xml格式输出结果 
            config.Formatters.XmlFormatter.UseXmlSerializer = true;

            config.Formatters.Remove(config.Formatters.JsonFormatter);
            // config.Formatters.JsonFormatter.UseDataContractJsonSerializer = true;
            //将web api以Middleware注册到OWIN管道中
            builder.UseWebApi(config);
        }
    }
复制代码

三,自定义Cache Middleware

3.1 HelloWorld Middleware

先建一个Middleware, 通过继承OwinMiddleware基类。这个Middleware的功能非常简单,就是打印当前的系统时间。

复制代码
public class HelloWorldMiddleware : OwinMiddleware
{
       public HelloWorldMiddleware(OwinMiddleware next) : base(next)
       {
       }

       public override Task Invoke(IOwinContext context)
       {
           var response = "Hello World! It is " + DateTime.Now;
           context.Response.Write(response);
           return Next.Invoke(context);
       }
}
复制代码

将该Middleware注册到OWIN管道后,执行得到的网页:

image

只要我们不断的刷新网页,每次显示的时间都会不同,因为每次都会重新读取系统时间,重新呈现页面。

3.2 Cache Middleware

实现cache middleware的思路比较简单,以访问的Url为key, 以输出的内容为value。第一次访问的时候,会缓存下来输出的内容,在下次访问的时候,将直接返回缓存的内容,而不是重新生成。具体代码如下:

  View Code

接下来,我们要改造HelloWorldMiddleware, 在HelloWorldMiddleware输出后,我们把输出的内容保存到Cache中。具体代码如下:

  View Code

最后,将CacheMiddleware添加到OWIN管道中发挥作用,注意注册管道的顺序问题,Middleware是一定要在HelloWorldMiddleware之前的。

复制代码
public class Startup
{
    public void Configuration(IAppBuilder app)
    {
        app.Use<CacheMiddleware>();
        app.Use<HelloWorldMiddleware>();
    }
} 
复制代码

四,总结

通过上面的示例,希望对大家如何编写Middleware有些基本的概念。
OWIN的优势在上面的例子中应该有些体现,就是Middleware之间通过数据和行为规范, 大家可以一起无缝地协同工作,任何第三方的Middleware都可以非常简单的集成到OWIN管道中,这应该是OWIN最大的魅力所在,开放的魅力。
同时, OWIN的目标是将Web Form, MVC, Web API统一到一个大的平台下,这将更加有助于混合编程。



本文转自JustRun博客园博客,原文链接:http://www.cnblogs.com/JustRun1983/p/3967757.html,如需转载请自行联系原作者


目录
相关文章
|
开发框架 算法 中间件
ASP.NET Core Middleware抽丝剥茧
ASP.NET Core Middleware是在ASP.NET Core处理管道中处理特定业务逻辑的组件。
ASP.NET Core Middleware抽丝剥茧
|
前端开发 中间件 .NET
ASP.NET Core 入门教程 9、ASP.NET Core 中间件(Middleware)入门
ASP.NET Core 入门教程 9、ASP.NET Core 中间件(Middleware)入门一、前言1、本教程主要内容ASP.NET Core 中间件介绍通过自定义 ASP.NET Core 中间件实现请求验签2、本教程环境信息软件/环境 说明操作系统 Windows 10SDK 2.
2038 0
|
中间件 .NET API
|
中间件 .NET 索引
利用Asp.Net Core的MiddleWare思想处理复杂业务流程
最近利用Asp.Net Core 的MiddleWare思想对公司的古老代码进行重构,在这里把我的设计思路分享出来,希望对大家处理复杂的流程业务能有所帮助。 背景 一个流程初始化接口,接口中根据传入的流程类型,需要做一些不同的工作。
1341 0
|
Web App开发 .NET Windows
基于ASP.NET WebAPI OWIN实现Self-Host项目实战
引用 寄宿ASP.NET Web API 不一定需要IIS 的支持,我们可以采用Self Host 的方式使用任意类型的应用程序(控制台、Windows Forms 应用、WPF 应用甚至是Windows Service)作为宿主。
1512 0
|
中间件 .NET 开发框架
菜鸟入门【ASP.NET Core】8:Middleware管道介绍、自己动手构建RequestDelegate管道
中间件:是汇集到以处理请求和响应的一个应用程序管道的软件。 每个组件: 可以选择是否要将请求传递到管道中的下一个组件。 之前和之后调用管道中的下一个组件,可以执行工作。 使用请求委托来生成请求管道。
1609 0
|
.NET 中间件 开发框架
ASP.NET Core轻松入门之Middleware管道模型
Middleware指的是微软的的asp.net core的管道模型。其原理可以用微软官方的下图展示: 原理如上图,随着Request的发起,HttpContext会经历多个管道处理(图中的箭头游走方向)每经过一个处理,HttpContext内都会被加入一些东西或者被做一些修改,在每个管道处理完成后,随着Next()传到下一个管道处理。
1151 0
|
存储 安全 .NET
【译】Asp.Net Identity与Owin,到底谁是谁?
送给正在学习Asp.Net Identity的你 :-) 原文出自 trailmax 的博客AspNet Identity and Owin. Who is who. Recently I have found an excellent question on Stackoverflow.
1034 0
|
前端开发 .NET 中间件