中间件
中间件
工作原理
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:传出响应。

浙公网安备 33010602011771号