中间件是一种装配到应用管道以处理请求和响应的软件。 每个组件:
- 选择是否将请求传递到管道中的下一个组件。
- 可在管道中的下一个组件前后执行工作。
请求委托用于生成请求管道。 请求委托处理每个 HTTP 请求。
管道中的中间件执行逻辑如下:
向 Startup.Configure
方法添加中间件组件的顺序定义了针对请求调用这些组件的顺序,以及响应的相反顺序。 此顺序对于安全性、性能和功能至关重要。
知道执行顺序,也就知道我们的中间件需要添加在那个位置(不同的位置,执行顺序不同),ASP.NET Core MVC中间件执行顺序如下:
ASP.NET Core自定义中间件构造函数参数必须有RequestDelegate委托,类中需要实现一个异步的InvokeAsync方法。
using System.Threading.Tasks;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.Logging;
namespace Research.Web.Middlewares
{
public class RequestMiddlewares
{
RequestDelegate _next;
ILogger _logger;
public RequestMiddlewares(RequestDelegate next, ILogger<RequestMiddlewares> logger)
{
this._next = next;
this._logger = logger;
}
public async Task InvokeAsync(HttpContext context, IWebHostEnvironment env)
{
//中间件代码……
if (context.Request.PathBase == null)
{
//让请求管道短路(不在继续执行后续组件)
await context.Response.WriteAsync("The request failed.");
}
//调用管道中的下一个组件
await _next(context);
}
}
public static class RequestMiddlewaresrExtensions
{
public static IApplicationBuilder UseRequestMiddlewares(this IApplicationBuilder app)
{
//将中间件添加到管道中
return app.UseMiddleware<RequestMiddlewares>();
}
}
}
此实列将 IWebHostEnvironment环境变量信息注入到了中间件。
使用自定义中间件,在Startup类中的Configure方法中使用如下:
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
app.UseRouting();
//自定义中间件
app.UseRequestMiddlewares();
}