【问题标题】:Why custom middlewares are not required to implement an interface or derive from a base class in asp.net core 3? [duplicate]为什么不需要自定义中间件来实现接口或从 asp.net core 3 中的基类派生? [复制]
【发布时间】:2026-01-28 02:40:01
【问题描述】:

我是 asp.net core 的新手,如果我的问题听起来很愚蠢,我很抱歉。在 asp.net core 3 中,我们可以实现一个自定义中间件,如下所示:

public class CustomMiddleware 
{
   private RequestDelegate next;
   public CustomMiddleware (RequestDelegate nextDelegate) {
      next = nextDelegate;
   }
   public async Task Invoke(HttpContext context) {
      ...
   }
}

所以我们的自定义中间件不需要实现诸如IMiddleware 之类的接口或从抽象的中间件基类继承,这对我来说有点奇怪。因为对于控制器之类的其他东西,我们有public class HomeController : ControllerBase。那么为什么微软不为自定义中间件设置强类型接口/抽象类,例如,

public abstract class BaseMiddleware {
    public BaseMiddleware(RequestDelegate nextDelegate) {
      next = nextDelegate;
    }
    public abstract async Task Invoke(HttpContext context);
}

这样我们的自定义中间件就可以:

public class CustomMiddleware : BaseMiddleware 
{
   public CustomMiddleware(RequestDelegate nextDelegate) : base(nextDelegate) {}
   public override async Task Invoke(HttpContext context) {
      ...
   }
}

【问题讨论】:

  • 如果 MS 按照您建议的方式完成,您无法在 Invoke 方法中注入服务,因为它的签名将被修复。

标签: c# asp.net-core middleware


【解决方案1】:

您确实有可能实现IMiddleware (MSDN)。它的签名与普通的签名略有不同,因为该接口已通过以下方式声明了Invoke 方法:

System.Threading.Tasks.Task InvokeAsync 
  (Microsoft.AspNetCore.Http.HttpContext context,
   Microsoft.AspNetCore.Http.RequestDelegate next)

如您所见,RequestDelegate 现在是Invoke 方法参数的一部分。在常规情况下,您会在自定义中间件的 ctor 中收到该引用。

同样,如果您的中间件依赖于任何依赖项,那么您将以不同的方式收到它:

public class MiddlewareA
{
    private readonly RequestDelegate _next;

    public MiddlewareA(RequestDelegate next)
    {
        _next = next;
    }

    public async Task InvokeAsync(HttpContext context, IDependency dep)
    {
        ...
        await next(context);
    }
}
public class MiddlewareB : IMiddleware
{
    private readonly IDependency _dep;

    public FactoryActivatedMiddleware(IDependency dep)
    {
        _dep = dep;
    }

    public async Task InvokeAsync(HttpContext context, RequestDelegate next)
    {
        ...
        await next(context);
    }
}

这种类型的中间件称为factory-based middleware

【讨论】:

    最近更新 更多