如何在经典ASP.NET(Framework)中获取所有已注册路由?
在经典ASP.NET(.NET Framework)中获取所有注册路由
刚好可以帮你对比传统WebAPI和.NET 6 API的路由获取方式,下面分两种经典ASP.NET场景来讲解:
1. ASP.NET MVC(.NET Framework)
经典MVC的路由都注册在RouteTable.Routes集合里,你可以直接遍历这个集合提取路由信息。比如写一个调试用的Action:
public ActionResult ListRoutes() { var routes = RouteTable.Routes .OfType<Route>() .Select(r => new { Name = r.RouteName, Url = r.Url, Defaults = r.Defaults?.Keys.Zip(r.Defaults?.Values, (k, v) => $"{k}={v}").Aggregate((a, b) => $"{a}, {b}"), Constraints = r.Constraints?.Keys.Zip(r.Constraints?.Values, (k, v) => $"{k}={v}").Aggregate((a, b) => $"{a}, {b}") }) .ToList(); return Json(routes, JsonRequestBehavior.AllowGet); }
这段代码会把所有MVC路由的名称、URL模板、默认值和约束提取出来,返回成JSON格式方便查看。
2. ASP.NET Web API(.NET Framework)
传统Web API有独立的路由系统,需要从GlobalConfiguration.Configuration.Routes里获取:
public HttpResponseMessage GetRoutes() { var routeDictionary = GlobalConfiguration.Configuration.Routes; var routes = new List<object>(); foreach (var route in routeDictionary) { var httpRoute = route as HttpRoute; if (httpRoute != null) { routes.Add(new { Name = routeDictionary.GetRouteName(route), Url = httpRoute.RouteTemplate, Defaults = httpRoute.Defaults?.ToDictionary(kv => kv.Key, kv => kv.Value), Constraints = httpRoute.Constraints?.ToDictionary(kv => kv.Key, kv => kv.Value.ToString()) }); } } return Request.CreateResponse(HttpStatusCode.OK, routes); }
这段代码专门针对Web API的路由,提取对应的模板、默认值等信息,返回JSON响应。
和.NET 6 API的对比
.NET 6采用了端点路由系统,获取路由的方式更统一,核心是通过注入IEnumerable<EndpointDataSource>来获取所有端点信息:
[ApiController] [Route("api/routes")] public class RoutesController : ControllerBase { private readonly IEnumerable<EndpointDataSource> _endpointDataSources; public RoutesController(IEnumerable<EndpointDataSource> endpointDataSources) { _endpointDataSources = endpointDataSources; } [HttpGet] public IActionResult GetAllRoutes() { var routes = _endpointDataSources.SelectMany(eds => ed.Endpoints) .OfType<RouteEndpoint>() .Select(re => new { RoutePattern = re.RoutePattern.RawText, HttpMethods = re.Metadata.OfType<HttpMethodMetadata>()?.FirstOrDefault()?.HttpMethods, DisplayName = re.DisplayName }) .ToList(); return Ok(routes); } }
这个方式可以统一获取MVC、Web API甚至Minimal API的所有端点路由信息,比经典ASP.NET的拆分方式更简洁。
内容的提问来源于stack exchange,提问作者Saibamen
相关产品推荐
相关产品推荐

