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

qqq*_*qqq 0 c# middleware .net-core asp.net-core

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

例如,在教程中,建议定制中间件,但我不了解其背后的原因。

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>();
    }
} 
Run Code Online (Sandbox Code Playgroud)

Nko*_*osi 5

根据文档,这是设计使然

中间件类必须包括:

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

参考编写自定义ASP.NET Core中间件

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

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

public delegate System.Threading.Tasks.Task RequestDelegate(HttpContext context);
Run Code Online (Sandbox Code Playgroud)

来自评论:致谢@ScottChamberlain

原因是与asp.net核心相比,异步是如何内置的,与非异步版本相比,它允许针对相同硬件的Web请求的吞吐量更高。