You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在经典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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 16:30:35