posted at 2021.4.25 13:10 by Administrator
在ASP.NET Core中,处理请求和响应是一个管道模型,中间件表示这个管道模型中的处理环节。中间件是按照注册顺序工作的,先注册的中间件先执行,然后通过Next方法调用后续中间件,后续中间件执行完毕后,回到先前的中间件中,最终完成响应。
本质是,中间件是一组委托Microsoft.AspNetCore.Http.RequestDelegate所组成的。
具体定义如下:
Public delegate Task RequestDelegate(HttpContext context);
这里可以看出中间件就是对HttpContext的处理函数,通过将一组包含不同功能的中间件进行串联,就得到完整的HTTP请求处理和响应输出的功能。
实质上中间件具备以下功能:
1、对HTTPContext进行处理,然后交给后续中间件处理,如路由中间件。
2、对HTTPContext进行处理,然后返回给上游中间件,如MVC中间件。
一、注册中间件
ASP.NET Core框架提供了多种方法来实现不同方式的注册。
1、Use:以委托的方式注册中间件。
2、UseMiddleware<T>:以类型的方式注册中间件,T表示中间件的类型。
3、Map:将特定的请求地址(path)与中间件绑定,即path匹配时执行该中间件。
4、MapWhen:定义一个逻辑判断委托,当判断为true时执行指定的中间件。
5、Run:表示一个断路的中间件,是执行并返回给上游的中间件,无后续中间件。
示例代码如下:
public void Configure(IApplicationBuilder app)
{
app.Map("/thunder", abcBuild =>
{
abcBuild.Use(async (Context, next) =>
{
await next();
await Context.Response.WriteAsync("Hello guangbu!");
});
});
}
要使用UseMiddleware<T>,需要使用符合中间件的类型,该方法没有使用泛型类型约束来约束T,而是使用了约定的方式。中间件类型需要符合下列的条件:
1、具有包含RequestDelegate作为参数的仅有构造函数。
2、具有Invoke或InvokeAsynchronous方法,至少一个入参,并且第一个入参类型必须是HTTPContext,其返回值必须是Task。
二、常用的内置中间件
ASP.NET Core关于HTTP处理的核心功能都是以中间件的形式提供的,内置了许多中间件,这里列举一些常用的:
1、异常处理中间件:负责请求管道错误处理,一般注册在第一个,用来处理全局异常。
2、开发异常中间件:开发阶段使用的错误信息展示页。
3、HTTPS重定向中间件:强制HTTPS跳转,当识别到用户请求不是HTTPS时,强制跳转,这是一个安全功能。
4、静态文件中间件:默认将wwwroot目录下的静态文件转出,当path与文件路径匹配时输出对应的文件。
5、路由中间件:将请求信息转化为路由信息,供后续终结点中间件使用。
6、身份认证中间件:启用身份认证,当终结点或者Controler上标识了身份认证特性时会进行身份认证。
7、Endpoint中间件:定义Controler与URL的映射关系,为URL绑定处理程序,MVC、RazorPages、SignalR等都是基于Endpoint中间件进行工作的。默认情况下,当请求与所有的Endpoint都不匹配时,应用程序会返回HTTP 404响应码,同时,提供了一组MapFallback方法来处理未匹配成功的请求。示例代码如下:
public void Configure(IApplicationBuilder app)
{
//添加身份认证中间件
app.UseAuthentication();
app.UseRouting();
app.UseCors();
//添加授权中间件
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllerRoute(
name: "default",
pattern: "{controller=Course}/{action=List}/{id?}");
endpoints.MapFallbackToFile("clock.html");
});
}
3e5ef3ee-0099-49e4-891a-59870b162020|0|.0|96d5b379-7e1d-4dac-a6ba-1e50db561b04
Tags: app, 程序, 代码, 泛型, 方法, 类, 模
IT技术