📅  最后修改于: 2023-12-03 15:29:29.935000             🧑  作者: Mango
在 ASP.NET Core 中,中间件是执行 HTTP 请求和响应的组件。ASP.NET Core 中间件可以处理 HTTP 请求和响应,以及改变它们的内容。它可以重写请求路径、添加头信息、设置缓存策略、启用跨域请求等。ASP.NET Core 还提供了许多中间件,包括身份认证、静态文件、MVC 控制器、Web API 等。
ASP.NET Core 中间件在应用程序管道中按特定顺序执行。它们可以在管道的开始、中途或末尾执行。ASP.NET Core 中间件可以是同步或异步的。同步中间件是最常用的类型,因为它们可以显式地控制请求流在管道内的位置和处理。异步中间件可以在异步模式下执行,这意味着请求不会阻塞线程池中的工作线程。异步中间件可以处理请求时异步等待耗时的数据库或 IO 操作。
ASP.NET Core 中间件的配置通过一个名为 Use 的扩展方法来进行。例如,以下代码添加了一个响应 "Hello, World!" 的中间件:
app.Use(async (context, next) =>
{
await context.Response.WriteAsync("Hello, World!");
});
上面的代码中,Use 方法接受一个 RequestDelegate 委托。RequestDelegate 委托包含当前 HTTP 上下文(HttpContext)和一个指向下一个中间件的委托(Next)。由于我们没有调用 Next 委托,从而跳过了后续中间件的处理,直接返回了响应 "Hello, World!"。
中间件可以定义它们在管道中的位置。例如,静态文件中间件必须在 MVC 中间件之前执行,这样 MVC 中间件才能响应动态页面。为此,ASP.NET Core 提供了多个扩展方法来配置中间件的执行顺序。例如,UseWhen、UseMiddleware、UseSession 等。
以下示例显示了如何在 ASP.NET Core 中使用多个中间件:
app.UseStaticFiles();
app.Use(async (context, next) =>
{
context.Response.ContentType = "text/html";
await context.Response.WriteAsync("<html><body>Hello, World!</body></html>");
});
app.UseAuthentication();
app.UseRouting();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
});
如果 ASP.NET Core 中默认提供的中间件不能满足我们的需求,可以编写自定义中间件。自定义中间件可以通过创建一个扩展方法来实现。以下示例显示了如何编写一个能够记录请求时间和处理时间的中间件:
public static class TimingMiddlewareExtensions
{
public static IApplicationBuilder UseTimingMiddleware(this IApplicationBuilder builder)
{
return builder.UseMiddleware<TimingMiddleware>();
}
}
public class TimingMiddleware
{
private readonly RequestDelegate _next;
public TimingMiddleware(RequestDelegate next)
{
_next = next;
}
public async Task InvokeAsync(HttpContext context)
{
var stopwatch = Stopwatch.StartNew();
await _next(context);
stopwatch.Stop();
Log.Information($"Request took {stopwatch.ElapsedMilliseconds}ms");
}
}
在上面的代码中,我们编写了一个名为 TimingMiddleware 的自定义中间件。它记录了请求开始和结束时间,并记录了请求处理的总时间。为了使用中间件,我们创建了一个扩展方法 UseTimingMiddleware。该方法创建了一个 TimingMiddleware 实例,并将其添加到应用程序管道中。
ASP.NET Core 中的中间件为 HTTP 请求和响应提供了强大的处理功能。通过具有明确定义顺序的多个中间件可以在应用程序管道中添加和处理不同的功能。如果默认提供的功能不能够满足需求,可以编写自定义中间件实现相应的功能。