ASP.NET Core中间件

 中间件是集成进一个app处理管道的一些软件,它们用来处理请求和响应。每一个组件:

  •  选择是否将请求传递给管道中的下一个组件。
  •  可以在管道中的下一个组件之前或者之后执行一些工作。

请求委托被用来创建请求管道。请求委托处理HTTP请求。

我们用RunMap,以及Use扩展方法来配置请求委托。一个请求委托可以以内联的方法指定(称之为内联中间件),或者也可以在一个可复用的类中进行定义。这些可复用的类以及匿名方法便是中间件。或者也可以 称为中间件组件,请求管道中的每个中间件都会负责激活管道中的下一个中间件,或者将管道短路。当一个中间件短路时,它被成为终端中间价,因为它阻止中间件继续处理请求。

Migrate HTTP handlers and modules to ASP.NET Core middleware 解释了ASP.NET Core和ASP.NET 4.x的请求处理管道的不同,并提供了额外的中间件实例。

使用IApplicationBuilder创建一个中间件管道

       ASP.NET Core的请求处理管道包含一系列的请求委托,它们一个接一个被调用。下列图形演示了这个概念。黑色的箭头指示了执行线程:

                                                    

         每一个委托都可以在下一个委托之前或者之后执行一些操作。异常处理委托应该在管道中较早的调用,所以它们才能够捕获管道后续阶段发生的异常。

         这个可能是最简单的ASP.NET Core app使用一个单独的请求委托来处理所有的请求。这个简单的示例不包含实际的请求处理管道,而是调用了一个匿名方法来响应每一个HTTP请求。

public class Startup
{
    public void Configure(IApplicationBuilder app)
    {
        app.Run(async context =>
        {
            await context.Response.WriteAsync("Hello, World!");
        });
    }
}

        使用Use方法将多个请求委托链接在一起。链表中的next参数代表了管道中的下一个委托。你也可以通过不调用next参数来将管道短路。典型的,你可以在下一个委托之前或者之后执行一些动作,如同下列示例演示的:

public class Startup
{
    public void Configure(IApplicationBuilder app)
    {
        app.Use(async (context, next) =>
        {
            // Do work that doesn't write to the Response.
            await next.Invoke();
            // Do logging or other work that doesn't write to the Response.
        });

        app.Run(async context =>
        {
            await context.Response.WriteAsync("Hello from 2nd delegate.");
        });
    }
}

        当一个委托不将请求传递给下一个委托的时,我们说它将请求管道短路。通常情况下短路操作是必要的,这是因为其可以避免不必要的工作。举个例子,Static File Middleware 可以表现得如同一个终端中间件,其处理对静态文件的请求并将管道的剩余部分短路。在终端中间件之前添加进管道的中间件在它们的next.Invoke方法被调用之后仍旧会处理代码。然而,请看下列关于企图向已经发送的响应进行写入操作的警告:

      警告:在响应已经被发送给客户端之后,请不要调用next.Invoke方法。在响应已经开始之后对HttpResponse的更改都会抛出一个异常。举个例子,比如设置头信息以及状态码便会抛出一个异常。在调用next之后向响应体写入会:

  •  导致一个协议冲突。比如写入比声明的Content-Length更多的内容。
  •  破坏响应体的格式。比如向一个CSS文件写入HTML尾。

      HasStarted是一个有用的暗示,以用来指示头部是否已经发送或者响应体是否已经被写入。

猜你喜欢

转载自www.cnblogs.com/qianxingmu/p/12401426.html