将中间件附加到 ASP.NET Core Web API 中的特定路由?

Roy*_*mir 3 c# .net-core asp.net-core-webapi

在 内部configure,我可以使用以下方法附加一个全局中间件:

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
   ....
   app.UseMiddleware<MyMiddleware>();
   ...
}
Run Code Online (Sandbox Code Playgroud)

这将适用于所有操作。

但是,我想,如何将中间件附加到特定的路由/操作?(当然我可以在代码中添加一些 if,但我不喜欢这种方法

但后来我看到了这个:

 app.UseEndpoints(endpoints =>
  {
      endpoints.Map("/version", endpoints.CreateApplicationBuilder()
               .UseMiddleware<MyMiddleware>()
               .UseMiddleware<VersionMiddleware>()
               .Build())
               .WithDisplayName("Version number"); 
  }
Run Code Online (Sandbox Code Playgroud)

这可以工作,但会创建一个新的端点/version

问题

如何将自定义中间件附加到现有控制器操作路由?

我试过了:

endpoints.Map("/weatherforecast", endpoints.CreateApplicationBuilder()
    .UseMiddleware<MyMiddleware>()
    .UseMiddleware<VersionMiddleware>()
    .Build())
    .WithDisplayName("Version number");
Run Code Online (Sandbox Code Playgroud)

但似乎并不影响。我看到管制员定期回复。没有中间件添加的新标头。

T. *_*sen 5

当你需要地图时

https://www.devtrends.co.uk/blog/conditional-middleware-based-on-request-in-asp.net-core

来自链接,修改:

app.UseMiddlewareOne();

app.MapWhen(context => context.Request.Path.StartsWithSegments("/version", StringComparison.OrdinalIgnoreCase)), appBuilder =>
{
    appBuilder.UseMiddlewareTwo();
});

app.UseMiddlewareThree();
Run Code Online (Sandbox Code Playgroud)

  • 当您使用 MapWhen 并且条件为 true 时,下一个中间件将不会运行。如果您想运行下一个中间件,可以使用 UseWhen。 (2认同)