ASP Core如何获取所有端点并生成含分支管道基路径的完整路径
解决方案
核心原理
ASP Core中通过Map()方法注册的分支管道基路径不会直接合并到端点的RoutePattern属性中,而是会以IRoutePrefixMetadata类型的元数据形式存储在端点的元数据集合中,我们只需要提取所有前缀再和当前端点的路由模板拼接即可得到完整路径。
实现代码
先写一个扩展方法来统一处理路径拼接:
using Microsoft.AspNetCore.Routing; public static class EndpointExtension { public static string GetCompletePath(this Endpoint endpoint) { // 过滤非路由类型的端点 if (endpoint is not RouteEndpoint routeEndpoint) { return string.Empty; } // 收集所有分支的路径前缀,处理首尾斜杠避免重复 var prefixList = endpoint.Metadata .OfType<IRoutePrefixMetadata>() .Select(m => m.Prefix.Trim('/')) .Where(p => !string.IsNullOrWhiteSpace(p)); // 获取当前端点的路由模板 var currentRoute = routeEndpoint.RoutePattern.RawText?.Trim('/') ?? string.Empty; // 拼接完整路径,统一前缀带斜杠 var fullPath = "/" + string.Join('/', prefixList.Append(currentRoute)).Trim('/'); return fullPath == "/" ? fullPath : fullPath.TrimEnd('/'); } }
使用方式
你拿到端点集合后直接遍历调用扩展方法即可:
var endpoints = services.GetRequiredService<EndpointDataSource>().Endpoints; foreach (var endpoint in endpoints) { var fullRoute = endpoint.GetCompletePath(); if (!string.IsNullOrEmpty(fullRoute)) { // 按需处理生成的完整路径 Console.WriteLine(fullRoute); } }
注意事项
- 该实现兼容ASP Core 3.1及以上版本,支持控制器路由、特性路由、
MapGet()/MapPost()等手动注册的端点、多层嵌套Map()分支下的端点路径生成 - 不带路径前缀的
MapWhen()分支不会生成额外前缀,不影响最终路径结果 - 如需排除健康检查、Swagger等系统内置端点,可以在遍历阶段通过端点元数据过滤对应标记即可
内容的提问来源于stack exchange,提问作者nod
相关产品推荐
相关产品推荐

