获取属性路由模板列表 asp.net webapi 2.2
get a list of attribute route templates asp.net webapi 2.2
我在 C# 中使用 WebApi 2.2 有一个 .NET 项目 运行。
我正在使用属性注册我的所有路线。我想做的是以编程方式将所有属性路由模板检索为字符串。
类似于:var routeTemplates = System.Web.Routing.RouteTable.Routes.Select(x => x.RouteTemplates);
当我把手表放在 ControllerContext.Configuration.Routes
上时,我能够看到所有的路线
但是,我似乎无法从我的代码访问路由,因为它们是受保护的内部结构。 我如何获得它们?
我附上了一张屏幕截图,其中显示了我在 locals watch
上看到的我需要获取的值。
在 Web API 中注册属性路由时,您可以注册自定义 IDirectRouteProvider
以自定义属性路由的查找方式。在该自定义 IDirectRouteProvider
中,您可以将所有 "hard" 工作委托给默认实现 DefaultDirectRouteProvider
,它查看所有控制器和操作以计算属性路由列表,然后归功于此感谢所有的辛勤工作。
要设置这一切,首先创建一个新的 "observable" 委托其所有工作的直接路由提供者:
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;
}
}
然后在您的应用启动时使用 WebApiConfig.Register
方法中的新 class:
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
属性 中还有其他数据。
我在 C# 中使用 WebApi 2.2 有一个 .NET 项目 运行。
我正在使用属性注册我的所有路线。我想做的是以编程方式将所有属性路由模板检索为字符串。
类似于:var routeTemplates = System.Web.Routing.RouteTable.Routes.Select(x => x.RouteTemplates);
当我把手表放在 ControllerContext.Configuration.Routes
但是,我似乎无法从我的代码访问路由,因为它们是受保护的内部结构。 我如何获得它们?
我附上了一张屏幕截图,其中显示了我在 locals watch
上看到的我需要获取的值。
在 Web API 中注册属性路由时,您可以注册自定义 IDirectRouteProvider
以自定义属性路由的查找方式。在该自定义 IDirectRouteProvider
中,您可以将所有 "hard" 工作委托给默认实现 DefaultDirectRouteProvider
,它查看所有控制器和操作以计算属性路由列表,然后归功于此感谢所有的辛勤工作。
要设置这一切,首先创建一个新的 "observable" 委托其所有工作的直接路由提供者:
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;
}
}
然后在您的应用启动时使用 WebApiConfig.Register
方法中的新 class:
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
属性 中还有其他数据。