【问题标题】:Why is it recommended for a middleware to be async in ASP.NET Core?为什么建议中间件在 ASP.NET Core 中异步?
【发布时间】:2019-11-28 17:28:31
【问题描述】:

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

【问题讨论】:

  • 不确定您的问题是什么。如果您正在执行同步代码,则不必异步/等待,这也是链接文章所说的。如果您的代码是异步的(并且不需要 awaiting 代码),您只需返回委托 ratehr 而不是等待它,即 return _next(httpContext) 而不是 await _next(httpContext) (然后还从方法声明中删除异步)
  • 如果你只使用async/await 内部没有真正的异步调用,你就没有必要导致一个状态机(async/await 生成一个处理异步代码执行的状态机)。我不知道您在该网站上的何处阅读了“推荐”,它没有在任何地方提及。一直以来的建议是,如果您调用异步代码,请使用 async/await,否则不使用并返回任务,除非您需要处理异步委托/方法抛出的异常(try/catch 不适用于 return _next(httpContext)

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


【解决方案1】:

根据文档,这是设计使然

中间件类必须包括:

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

参考Write custom ASP.NET Core middleware

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

RequestDelegate 是 asp.net core 管道的核心,需要 Task 才能实现高性能和模块化的 HTTP 请求管道。

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

来自评论:感谢@ScottChamberlain

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

【讨论】:

  • 所以,只是设计使然。是吗?
  • @qqqqqqq 是的,微软就是这样设计的。
  • @qqqqqqq 如果您正在寻找更多“为什么”,原因是在 asp.net 核心中内置异步的方式在比较时允许相同硬件的 Web 请求的更高吞吐量到非异步版本。
  • @ScottChamberlain 我会在帖子中引用它。
  • 如果你让它异步,那么它可以在等待时在同一个线程上执行其他东西,如果你让它同步,那么你就阻塞了一个线程。我还认为这在 99.9% 的情况下都无关紧要,特别是如果您的代码只能运行一两毫秒。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-28
相关资源
最近更新 更多