中间件

中间件

  工作原理

    1.可以同时处理传入请求和传出响应

    2.终止中间件:可以处理请求,并决定不调用管道中的下一个中间件,从而使管道短路

    3.可以传入的HTTP请求来响应HTTP请求

    4.按照添加到管道的顺序执行的

    5.应该以NuGet包的形式提供

配置请求处理管道

  Startup.cs中Configure方法设置请求处理管道

     

  UseDeveloperExceptionPage()

    存在异常并且环境是Development时,中间件被调用,显示开发异常页面

  Run()

    只能处理信息传入的Response对象

    在这种情况下,无论请求路径是什么,所有请求都会被这个中间件处理,上面案例是调用Response对象返回的string类型的字符串

  注意,返回的是纯文本不是HTML

 

  Run方法是作为IApplicationBuilder接口的扩展方法实现的

   Adds a terminal middleware delegate to the application's request pipeline.

  终止中间价

 

  参数RequestDelegate:

    是一个作为 HttpContext对象的参数委托。

    通过这个HttpContext对象,中间件可以访问传入的HTTP请求和传出的HTTP响应

 

    用 Lambda将请求进行传递,因为 Lambda通过委托内联的方式作为匿名方法传递,

    所以 Lambda表达式是一种特殊的委托。

 

  app.Use(async (context,next)=> {
      await next();
  });

  Adds a middleware delegate defined in-line to the application's request pipeline.

  将内嵌定义的中间件委托添加到应用程序的请求管道中。

  第一个参数HttpContext上下文对象,

  第二个参数Func类型,代表管道中下一个中间件的通用委托

 

实践中间件工作流程

  开启log

  在Program.cs中添加,ILogger配置,AddConfiguration,Console,Debug,和 EventSource

     

在Startup.cs的Configure中添加

app.Use(async (context,next)=> {
    logger.LogInformation("MW1: 传入请求");//1
    await next();
    logger.LogInformation("MW1: 传出响应");//5
});
app.Use(async (context, next) => {
    logger.LogInformation("MW2: 传入请求");//2
    await next();
    logger.LogInformation("MW2: 传出响应");//4
});
app.Run(async (context) =>
{
    //防止乱码
    context.Response.ContentType = "text/plain; charset=utf-8";
    //注入后通过Configuration访问MyKey
    await context.Response.WriteAsync("MW3: Hello 01");//Configuration["MyKey"]
    logger.LogInformation("MW3: 传出响应");//3
});

 

 

MW1:传入请求。

Mw2:传入请求。

MW3 :处理请求并生成响应。

MW2:传出响应。

MW1:传出响应。

 

posted @ 2021-06-01 09:39  努力奋斗的小丑  阅读(152)  评论(0)    收藏  举报