获取属性路由模板列表asp.net webapi 2.2

Ray*_*zer 12 c# asp.net-web-api

我有一个使用WebApi 2.2在C#中运行的.NET项目.

我正在使用属性注册我的所有路线.我想要做的是以编程方式将所有属性路径模板检索为字符串.

就像是: var routeTemplates = System.Web.Routing.RouteTable.Routes.Select(x => x.RouteTemplates);

当我看表时,我能够看到所有的路线 ControllerContext.Configuration.Routes

但是,我似乎无法从我的代码访问路由,因为它们是受保护的内部.我怎么得到它们?

我附上了一个屏幕截图,显示了我在locals watch我需要看到的值.

我想要获得的数据

Eil*_*lon 12

在Web API中注册属性路由时,您可以注册自定义IDirectRouteProvider以自定义属性路由的查找方式.在该自定义中,IDirectRouteProvider您可以将所有"硬"工作委派给默认实现,DefaultDirectRouteProvider查看所有控制器和操作以计算属性路由列表,然后对所有这些艰苦工作表示赞赏.

要设置这一切,首先要创建一个新的"可观察"直接路由提供程序,该提供程序委派其所有工作:

public class ObservableDirectRouteProvider : IDirectRouteProvider
{
    public IReadOnlyList<RouteEntry> DirectRoutes { get; private set; }

    public IReadOnlyList<RouteEntry> GetDirectRoutes(HttpControllerDescriptor controllerDescriptor, IReadOnlyList<HttpActionDescriptor> actionDescriptors, IInlineConstraintResolver constraintResolver)
    {
        var realDirectRouteProvider = new DefaultDirectRouteProvider();
        var directRoutes = realDirectRouteProvider.GetDirectRoutes(controllerDescriptor, actionDescriptors, constraintResolver);
        // Store the routes in a property so that they can be retrieved later
        DirectRoutes = DirectRoutes?.Union(directRoutes).ToList() ?? directRoutes;
        return directRoutes;
    }
}
Run Code Online (Sandbox Code Playgroud)

然后WebApiConfig.Register在应用启动的方法中使用这个新类:

public static class WebApiConfig
{
    public static ObservableDirectRouteProvider GlobalObservableDirectRouteProvider = new ObservableDirectRouteProvider();

    public static void Register(HttpConfiguration config)
    {
        // Web API configuration and services

        // Web API routes
        config.MapHttpAttributeRoutes(GlobalObservableDirectRouteProvider);

        config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );
    }
}
Run Code Online (Sandbox Code Playgroud)

请注意,数据最终存储在静态字段中.这是必需的,因为里面的代码WebApiConfig.Register不会被立即调用 - 稍后会调用它global.asax.cs.因此,要观察所有内容的结果,请添加一些代码Application_Start:

protected void Application_Start()
{
    AreaRegistration.RegisterAllAreas();
    GlobalConfiguration.Configure(WebApiConfig.Register);
    FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
    RouteConfig.RegisterRoutes(RouteTable.Routes);
    BundleConfig.RegisterBundles(BundleTable.Bundles);

    var allDirectRoutes = WebApiConfig.GlobalObservableDirectRouteProvider.DirectRoutes;
    // now do something with 'allDirectRoutes'
}
Run Code Online (Sandbox Code Playgroud)

在我写的一个小测试中,我得到了这些值:

在此输入图像描述

你有它,它是应用程序中所有属性路由的列表!

注意:DataTokens如果您想弄清楚每个属性路径的来源,那么每条路线的属性中都会有额外的数据.

  • 有了这个解决方案,有一个很好的方法来获得每条路线的可接受的动词吗? (2认同)