如何在ASP.NET Core中间件中跳过特定路由?
在ASP.NET Core中间件中根据路由值执行特定代码
下面是几种在中间件里仅当路由包含特定值时执行代码的实用方案:
1. 直接检查Request.Path(简单路由场景)
如果只是需要匹配路由路径中包含特定字符串(比如/admin前缀),可以直接读取HttpContext.Request.Path进行判断:
public async Task InvokeAsync(HttpContext context) { // 检查路径是否包含"/admin"前缀 if (context.Request.Path.StartsWithSegments("/admin")) { // 这里放你要执行的特定代码 Console.WriteLine("当前路由包含/admin前缀,执行专属逻辑"); } // 继续执行后续中间件 await _next(context); }
2. 通过RouteData获取路由参数(带参数的路由场景)
如果你的路由定义了参数(比如{controller}/{action}),可以通过RouteData获取具体的路由值来判断:
public async Task InvokeAsync(HttpContext context) { var routeData = context.GetRouteData(); if (routeData != null) { // 判断controller是否为"Admin"(忽略大小写) if (routeData.Values.TryGetValue("controller", out var controllerValue) && controllerValue.ToString().Equals("Admin", StringComparison.OrdinalIgnoreCase)) { // 执行特定代码 Console.WriteLine("当前路由的Controller是Admin,执行对应逻辑"); } } await _next(context); }
3. 针对端点路由的匹配(ASP.NET Core 3.0+)
如果项目使用了端点路由(默认启用),可以通过GetEndpoint()获取端点信息,检查路由模板或元数据:
public async Task InvokeAsync(HttpContext context) { var endpoint = context.GetEndpoint(); if (endpoint != null) { // 获取路由模板并检查是否包含特定值 var routePattern = endpoint.Metadata.GetMetadata<RoutePatternMetadata>()?.RoutePattern; if (routePattern != null && routePattern.RawText.Contains("admin")) { // 执行特定代码 Console.WriteLine("当前端点路由包含admin,执行对应逻辑"); } } await _next(context); }
注意:如果是在中间件链中比较靠前的位置调用GetEndpoint(),可能会返回null(因为端点路由还没完成匹配),这种情况下建议把中间件放在app.UseRouting()之后、app.UseEndpoints()之前。
内容的提问来源于stack exchange,提问作者Marian Kosaniak
相关产品推荐
相关产品推荐

