将中间件附加到 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 中间件将非 WWW 重定向到 WWW
ASP.NET Core Web API - 如何在中间件管道中隐藏 DbContext 事务?