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

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

我正在使用属性注册所有路由。 我想要做的是以语法方式检索所有属性路由模板作为字符串。

类似于: var routeTemplates = System.Web.Routing.RouteTable.Routes.Select(x => x.RouteTemplates);

当我在ControllerContext.Configuration.Routes上放置手表时,我能够看到所有路线

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

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

我想要的数据

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

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

 public class ObservableDirectRouteProvider : IDirectRouteProvider { public IReadOnlyList DirectRoutes { get; private set; } public IReadOnlyList GetDirectRoutes(HttpControllerDescriptor controllerDescriptor, IReadOnlyList 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; } } 

然后在应用程序启动时使用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 } ); } } 

请注意,数据最终存储在静态字段中。 这是必需的,因为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' } 

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

在此处输入图像描述

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

注意:如果要确定每个属性路由的来源,可以在每个路由的DataTokens属性中添加其他数据。