为什么建议中间件在ASP.NET Core中异步?
例如在this教程中,建议自定义中间件,但我不了解其背后的原因。
public class MyMiddleware
{
private readonly RequestDelegate _next;
private readonly ILogger _logger;
public MyMiddleware(RequestDelegate next, ILoggerFactory logFactory)
{
_next = next;
_logger = logFactory.CreateLogger("MyMiddleware");
}
public async Task Invoke(HttpContext httpContext)
{
_logger.LogInformation("MyMiddleware executing..");
await _next(httpContext); // calling next middleware
}
}
// Extension method used to add the middleware to the HTTP request pipeline.
public static class MyMiddlewareExtensions
{
public static IApplicationBuilder UseMyMiddleware(this IApplicationBuilder builder)
{
return builder.UseMiddleware<MyMiddleware>();
}
}
答案 0 :(得分:5)
根据文档,这是设计使然
中间件类必须包括:
- 参数类型为
RequestDelegate
的公共构造函数。- 名为
Invoke
或InvokeAsync
的公共方法。此方法必须:
- 返回
Task
。- 接受类型为
HttpContext
的第一个参数。
我的理解是,默认情况下管道已设计为异步。
RequestDelegate
是asp.net核心管道的核心,它需要Task
才能允许高性能的模块化HTTP请求管道。
public delegate System.Threading.Tasks.Task RequestDelegate(HttpContext context);
来自评论:感谢@ScottChamberlain
原因是,与非异步版本相比,通过在asp.net核心中内置异步的方式,它可以为相同硬件提供更多的Web请求吞吐量。