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

Posted

技术标签:

【中文标题】将中间件附加到 ASP.NET Core Web API 中的特定路由?【英文标题】:Attaching middleware to a specific route in ASP.NET Core Web API? 【发布时间】:2021-12-22 01:40:57 【问题描述】:

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

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)

   ....
   app.UseMiddleware<MyMiddleware>();
   ...

这将适用于所有操作。

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

但后来我看到了:

 app.UseEndpoints(endpoints =>
  
      endpoints.Map("/version", endpoints.CreateApplicationBuilder()
               .UseMiddleware<MyMiddleware>()
               .UseMiddleware<VersionMiddleware>()
               .Build())
               .WithDisplayName("Version number"); 
  

这会起作用,但会创建一个新端点/version

问题

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

我试过了:

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

但似乎没有影响。我看到控制器定期响应。没有中间件添加的新标头。

【问题讨论】:

为什么不在那里创建通用中间件和过滤路由? @zolty13 正如我所写:(当然我可以在代码中添加一些 if,但我不喜欢这种方法)。我相信还有另一种方式 ***.com/questions/51955806/…这对您有帮助吗? @zolty13 我想知道,阅读链接中的答案,app.UseRouter(BuildRouter(app)); 会覆盖所有其他路线吗?换句话说,它是添加还是替代? 【参考方案1】:

你需要 MapWhen

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();

【讨论】:

I've tried it ,但我得到一个 error 。 this is my middleware 我认为这个问题不是因为你的中间件是什么时候使用的,而是因为稍后在你的配置方法中,它告诉你在给定的情况下没有任何处理。您是否在 UseEndpoints 委托中包含了实例 endpoints.MapControllers();endpoints.MapDefaultControllerRoute() ? 是的,我做到了:i.imgur.com/rZtvRfm.jpg。仍然是同样的错误。我想我知道这里发生了什么。在中间件中,我实际上是在调用next (i.imgur.com/tIEH2vX.jpg)。但实际上没有下一个管道。但是,如果我 short circuit 它,then it does work。这是有道理的,因为在这个中间件之后没有可以调用的委托。 Whenmap 打开一个分支(!)。不是添加,而是作为新分支。所以next() 没有其他可供他使用的未来中间件。我说的对吗? 当你使用 MapWhen 并且条件为真时,下一个中间件将不会运行。如果要运行下一个中间件,可以使用 UseWhen。 @bugrakosen 关于我在这里的最后一条评论 ^,我的假设是否正确?

以上是关于将中间件附加到 ASP.NET Core Web API 中的特定路由?的主要内容,如果未能解决你的问题,请参考以下文章

我需要在 asp.net Core 中创建 XSRF 中间件吗?

如何在 ASP.Net Core 中使用 条件中间件

使用 Asp.Net Core 中间件将非 WWW 重定向到 WWW

ASP.NET Core Web API - 如何在中间件管道中隐藏 DbContext 事务?

将文件从 ASP.NET Core Web api 发布到另一个 ASP.NET Core Web api

ASP.NET Core 6框架揭秘实例演示[29]:搭建文件服务器