十二个 ASP.NET Core 例子——中间件

  目录:

 

  1. 什么是中间件(IApplicationBuilder)
  2. 创建
  3. 顺序规则
  4. Asp.Net Core 内置的中间件

 

      1.什么是中间件

      官方:中间件是组装成应用程序管道以处理请求和响应的软件。每个组件选择是否将请求传递给流水线中的下一个组件,并且可以在管道中调用下一个组件之前和之后执行某些操作。请求代理用于构建请求管道。请求委托处理每个HTTP请求。

      个人:对Http请求进行操作的逻辑块。逻辑块可以调用另外一个,也可以马上中断返回。

   2.创建中间件

创建中间件主要的操作函数:Run,Use,Map

Run:终止管道,返回response之前的一次逻辑操作

Use:逻辑操作,可以调用下一个中间件

Map: 根据地址的不同,操作不同的逻辑

注意点:如果在use中 调用下一个中间件,而这个中间是run,并且,在run后面还有中间件,那么use的所有逻辑都会处理完,而不是直接中断返回

        public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
        {
            app.Use(async (context, next) =>
            {
                await context.Response.WriteAsync("use1 ");
                await next();
                await context.Response.WriteAsync(" use2");
            });

            app.Run(async context =>
            {
                await context.Response.WriteAsync("run ");
            });
        }
View Code

 Map:

public class Startup
{
    private static void HandleMapTest1(IApplicationBuilder app)
    {
        app.Run(async context =>
        {
            await context.Response.WriteAsync("Map Test 1");
        });
    }

    private static void HandleMapTest2(IApplicationBuilder app)
    {
        app.Run(async context =>
        {
            await context.Response.WriteAsync("Map Test 2");
        });
    }

    public void Configure(IApplicationBuilder app)
    {
        app.Map("/map1", HandleMapTest1);

        app.Map("/map2", HandleMapTest2);

        app.Run(async context =>
        {
            await context.Response.WriteAsync("Hello from non-Map delegate. <p>");
        });
    }
}
View Code

 3.顺序规则

  添加中间件的顺序就是在请求上调用它们的顺序,此排序对于安全性,性能和功能至关重要。下面直接搬运

  配置方法(如下所示)添加了以下中间件组件:

  1. 异常/错误处理
  2. 静态文件服务器
  3. 认证
  4. MVC
        public void Configure(IApplicationBuilder app)
        {
            app.UseExceptionHandler("/Home/Error"); // Call first to catch exceptions
            // thrown in the following middleware.

            app.UseStaticFiles();                   // Return static files and end pipeline.

            app.UseIdentity();                     // Authenticate before you access
            // secure resources.

            app.UseMvcWithDefaultRoute();          // Add MVC to the request pipeline.
        }
View Code

在上面的代码中,UseExceptionHandler是添加到管道中的第一个中间件组件,因此它捕获在以后的调用中发生的任何异常。静态文件中间件在管道中提前调用,因此可以处理请求和短路,而无需通过剩余的组件。静态文件中间件提供没有授权检查。由其提供的任何文件,包括wwwroot下的文件都是公开的。如果请求不由静态文件中间件处理,则将其传递给执行身份验证的Identity中间件(app.UseIdentity)。身份不会使未经身份验证的请求发生短路。虽然身份认证请求,但授权(和拒绝)仅在MVC选择特定控制器和操作之后才会发生

4.内置中间件

 

posted @ 2017-05-09 14:54  TeemoHQ  阅读(717)  评论(0编辑  收藏  举报