如何查找属性路由及URL对应的控制器与Action?
快速定位属性路由对应的控制器与Action的方法
我来分享几个实用的方法帮你快速搞定这个问题,不用再挨个瞎搜路由名称啦:
方法一:用ASP.NET Core内置的路由诊断中间件
这是最直接的方式,只需要几行代码就能生成所有路由的映射清单:
在你的Program.cs里,找到app.UseRouting();之后的位置,添加这段代码:
app.UseEndpoints(endpoints => { // 新增一个用于查看路由的端点 endpoints.MapGet("/routes", async context => { var endpointDataSource = endpoints.DataSources.FirstOrDefault(); if (endpointDataSource != null) { var routes = endpointDataSource.Endpoints.OfType<RouteEndpoint>(); var routeDetails = routes.Select(r => new { RoutePattern = r.RoutePattern.RawText, Controller = r.Metadata.OfType<ControllerActionDescriptor>().FirstOrDefault()?.ControllerName, Action = r.Metadata.OfType<ControllerActionDescriptor>().FirstOrDefault()?.ActionName, HttpMethod = r.Metadata.OfType<HttpMethodMetadata>().FirstOrDefault()?.HttpMethods.FirstOrDefault() }); await context.Response.WriteAsJsonAsync(routeDetails); } }); // 保留你原有的端点配置 endpoints.MapControllers(); });
启动项目后访问/routes,就能看到所有路由的详细信息,包括路由模板、对应的控制器、Action名称,甚至请求方法。比如你提到的url/examples/1,就能找到RoutePattern为examples/{id}的条目,对应的Controller和Action就是你要找的目标。
方法二:调试时直接查看请求匹配的端点
在你怀疑的控制器Action里打个断点,或者在全局过滤器里,通过HttpContext获取当前匹配的端点:
var endpoint = HttpContext.GetEndpoint(); if (endpoint != null) { var actionDescriptor = endpoint.Metadata.OfType<ControllerActionDescriptor>().FirstOrDefault(); if (actionDescriptor != null) { // 这里就能拿到控制器和Action名称 string controllerName = actionDescriptor.ControllerName; string actionName = actionDescriptor.ActionName; } }
当请求url/examples/1进来时,断点触发后就能直接看到对应的控制器和Action信息。
方法三:Visual Studio快捷搜索技巧
如果你已经知道路由模板(比如examples/{id}),可以直接用VS的解决方案范围搜索:
- 按
Ctrl+Shift+F打开搜索窗口,输入[Route("examples/{id}")](注意引号要带上),就能直接定位到标注了这个路由的Action方法。 - 如果记不全完整模板,也可以搜
Route("examples这样的片段,缩小搜索范围。
方法四:第三方工具包(适用于老版本)
如果是ASP.NET Core 3.0之前的版本,内置功能不够完善,可以考虑安装专门的路由调试包(比如Route Debugger),这类工具会在页面上直观展示所有路由映射关系,以及请求对应的匹配结果。不过新版本用内置中间件就完全够用了。
内容的提问来源于stack exchange,提问作者MOG




