为什么建议中间件在ASP.NET Core中异步?

时间:2019-11-28 17:28:31

标签: c# asp.net-core .net-core middleware

为什么建议中间件在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>();
    }
} 

1 个答案:

答案 0 :(得分:5)

根据文档,这是设计使然

  

中间件类必须包括:

     
      
  • 参数类型为RequestDelegate的公共构造函数。
  •   
  • 名为InvokeInvokeAsync的公共方法。此方法必须:      
        
    • 返回Task
    •   
    • 接受类型为HttpContext的第一个参数。
    •   
  •   

参考Write custom ASP.NET Core middleware

我的理解是,默认情况下管道已设计为异步。

RequestDelegate是asp.net核心管道的核心,它需要Task才能允许高性能的模块化HTTP请求管道。

public delegate System.Threading.Tasks.Task RequestDelegate(HttpContext context);

来自评论:感谢@ScottChamberlain

  

原因是,与非异步版本相比,通过在asp.net核心中内置异步的方式,它可以为相同硬件提供更多的Web请求吞吐量。