C# 当'RoutePrefix'或'Route'属性未使用时,获取所有路由的列表(ASP.NET)
我有如下几个路由模板和许多控制器,其中包括几个端点 项目\App\u Start\WebApiConfig.cs: 公共静态类WebApiConfig { 公共静态无效注册表HttpConfiguration配置 { //代码省略 config.Routes.MapHttpRoute 名称:模板1, routeTemplate:api/{controller}/{id}/action ; config.Routes.MapHttpRoute 名称:模板2, routeTemplate:api/master/{controller}/{id}/{history}, 默认值:新建{id=RouteParameter.Optional,history=RouteParameter.Optional} ; config.Routes.MapHttpRoute 名称:默认模板, routeTemplate:api/{controller}/{id}, 默认值:新建{id=RouteParameter.Optional} ; } } 如何根据现有控制器及其方法获取所有路由端点的列表 我希望得到类似于:C# 当'RoutePrefix'或'Route'属性未使用时,获取所有路由的列表(ASP.NET),c#,asp.net,asp.net-web-api,C#,Asp.net,Asp.net Web Api,我有如下几个路由模板和许多控制器,其中包括几个端点 项目\App\u Start\WebApiConfig.cs: 公共静态类WebApiConfig { 公共静态无效注册表HttpConfiguration配置 { //代码省略 config.Routes.MapHttpRoute 名称:模板1, routeTemplate:api/{controller}/{id}/action ; config.Routes.MapHttpRoute 名称:模板2, routeTemplate:api/m
GET: api/xxx/
PUT: api/xxx/{id}
DELETE: api/xxx/{id}
PUT: api/yyy/{id}
等等
更新1
我尝试了Charles的建议,但它似乎只显示路线模板
更新2
我试过了
但是没有连接RoutePrefix或Route的端点没有包括在列表中。使用ActionDescriptor和http方法get、post等列出路由
[路线]
[ApiController]
公共类根控制器:ControllerBase
{
专用只读IActionDescriptorCollectionProvider _actionDescriptorCollectionProvider;
公共RootControlleriationDescriptorCollectionProvider操作描述符CollectionProvider
{
_actionDescriptorCollectionProvider=actionDescriptorCollectionProvider;
}
公共rootResultModelGet
{
var routes=\u actionDescriptorCollectionProvider.ActionDescriptors.Items.Where
ad=>ad.AttributeRouteInfo!=null。选择ad=>new RouteModel
{
Name=ad.AttributeRouteInfo.Template,
Method=ad.ActionConstraints?,of type.FirstOrDefault?.HttpMethods.First,
}托利斯特先生;
var res=新的RootResultModel
{
路线=路线
};
返回res;
}
}
使用ActionDescriptor和http方法get、post等列出路由
[路线]
[ApiController]
公共类根控制器:ControllerBase
{
专用只读IActionDescriptorCollectionProvider _actionDescriptorCollectionProvider;
公共RootControlleriationDescriptorCollectionProvider操作描述符CollectionProvider
{
_actionDescriptorCollectionProvider=actionDescriptorCollectionProvider;
}
公共rootResultModelGet
{
var routes=\u actionDescriptorCollectionProvider.ActionDescriptors.Items.Where
ad=>ad.AttributeRouteInfo!=null。选择ad=>new RouteModel
{
Name=ad.AttributeRouteInfo.Template,
Method=ad.ActionConstraints?,of type.FirstOrDefault?.HttpMethods.First,
}托利斯特先生;
var res=新的RootResultModel
{
路线=路线
};
返回res;
}
}
当RoutePrefix或Route属性未使用时,我没有找到获取ASP.NET中所有路由列表的方法,但以下解决方案对我有所帮助。 ※我认为当RoutePrefix或Route属性未使用时,不可能获得所有路线的正确列表 安装Microsoft.AspNet.WebApi.HelpPage软件包。 工具→ NuGet包管理器→ 包管理器控制台 PW>安装软件包Microsoft.AspNet.WebApi.HelpPage 编辑XXXProject\Global.asax.cs的应用程序启动方法,如下所示。 受保护的无效应用程序\u启动 { GlobalConfiguration.ConfigureWebApiConfig.Register; AreaRegistration.Registeralareas;//★添加这一行 } 编辑XXXProject\Areas\HelpPage\App\u Start\HelpPageConfig.cs的注册方法,如下所示。 公共静态无效注册表HttpConfiguration配置 { //取消注释以下内容以使用XML文档文件中的文档。 config.SetDocumentationProvidernew XmlDocumentationProviderHttpContext.Current.Server.MapPath~/App_Data/XmlDocument.xml;//★取消对此行的注释 } 启用XML文档文件。 解决方案浏览器→ 右键单击项目→ 选择属性→ 选择构建页面 在文本字段中输入App_Data/XmlDocument.xml。 您应该使用这些属性来获取正确的ASP.NET Web API帮助页 响应类型 [ResponseTypeOfMyObject] 公共HTTPResponseMessageGetMyObject RoutePrefix和Route [RoutePrefixapi/MyController] 公共类MyController:ApiController [路由对象] 公共HTTPResponseMessageGetMyObject FromUri和FromBody可选 公共HttpResponseMessage PutMyObject[FromUri]int-id[FromBody]MyObject MyObject 要将ASP.NET Web API的帮助页转换为静态html,可以使用wget。 比如说, wget-r-k-Ehttp:///Help/ 参考:
当RoutePrefix或Route属性未使用时,我没有找到获取所有路由ASP.NET列表的方法,但是 下面的解决方案帮助了我。 ※我认为当RoutePrefix或Route属性未使用时,不可能获得所有路线的正确列表 安装Microsoft.AspNet.WebApi.HelpPage软件包。 工具→ NuGet包管理器→ 包管理器控制台 PW>安装软件包Microsoft.AspNet.WebApi.HelpPage 编辑XXXProject\Global.asax.cs的应用程序启动方法,如下所示。 受保护的无效应用程序\u启动 { GlobalConfiguration.ConfigureWebApiConfig.Register; AreaRegistration.Registeralareas;//★添加这一行 } 编辑XXXProject\Areas\HelpPage\App\u Start\HelpPageConfig.cs的注册方法,如下所示。 公共静态无效注册表HttpConfiguration配置 { //取消注释以下内容以使用XML文档文件中的文档。 config.SetDocumentationProvidernew XmlDocumentationProviderHttpContext.Current.Server.MapPath~/App_Data/XmlDocument.xml;//★取消对此行的注释 } 启用XML文档文件。 解决方案浏览器→ 右键单击项目→ 选择属性→ 选择构建页面 在文本字段中输入App_Data/XmlDocument.xml。 您应该使用这些属性来获取正确的ASP.NET Web API帮助页 响应类型 [ResponseTypeOfMyObject] 公共HTTPResponseMessageGetMyObject RoutePrefix和Route [RoutePrefixapi/MyController] 公共类MyController:ApiController [路由对象] 公共HTTPResponseMessageGetMyObject FromUri和FromBody可选 公共HttpResponseMessage PutMyObject[FromUri]int-id[FromBody]MyObject MyObject 要将ASP.NET Web API的帮助页转换为静态html,可以使用wget。 比如说, wget-r-k-Ehttp:///Help/ 参考:
可能会有帮助:一个简单的代码片段,可以添加到Startup类中的Configure方法,可以至少在ASP.NET 3.1中检索已注册的路由。可能会有帮助:一个简单的代码片段,可以添加到Startup类中的Configure方法,应该至少在ASP.NET 3.1中检索已注册的路由这可能会有所帮助吗?SeM中,有关于ASP.NET的核心。它适合ASP.NET吗?tymtam,很抱歉有关于ASP.NET核心的问题。它适合ASP.NET吗?因为我已经被否决了,所以我不会再麻烦发布所有的代码了。但是,如果您想要一个包含所有端点的完整URL映射,则必须循环所有控制器的所有方法,获取ActionResult和Task类型的所有方法,然后在所有方法上使用GetCustomAttribute来获取HttpMethod。使用UrlHelper.GenerateUrl获取每个操作的Url。使用标题的确切措辞搜索duckduckgo会产生多个结果。问之前你没有尝试搜索吗?也许这会有帮助?SeM中,有关于ASP.NET的核心。它适合ASP.NET吗?tymtam,很抱歉有关于ASP.NET核心的问题。它适合ASP.NET吗?因为我已经被否决了,所以我不会再麻烦发布所有的代码了。但是,如果您想要一个包含所有端点的完整URL映射,则必须循环所有控制器的所有方法,获取ActionResult和Task类型的所有方法,然后在所有方法上使用GetCustomAttribute来获取HttpMethod。使用UrlHelper.GenerateUrl获取每个操作的Url。使用标题的确切措辞搜索duckduckgo会产生多个结果。询问之前是否未尝试搜索?错误CS0246类型或命名空间名称“IActionDescriptorCollectionProvider”、“IActionDescriptorCollectionProvider”、“RootResultModel”、“RouteModel”、“HttpMethodActionConstraint”、“RootResultModel”复制粘贴自?错误CS0246类型或命名空间名称“IActionDescriptorCollectionProvider”,“IActionDescriptorCollectionProvider”、“RootResultModel”、“RouteModel”、“HttpMethodActionConstraint”、“RootResultModel”复制粘贴源?
diff --git a/Project/App_Start/WebApiConfig.cs b/Project/App_Start/WebApiConfig.cs
index 9b5a05e..6eb376f 100755
--- a/Project/App_Start/WebApiConfig.cs
+++ b/Project/App_Start/WebApiConfig.cs
@@ -1,15 +1,33 @@
namespace Project
{
+ public class ObservableDirectRouteProvider : IDirectRouteProvider
+ {
+ public IReadOnlyList<RouteEntry> DirectRoutes { get; private set; }
+
+ public IReadOnlyList<RouteEntry> GetDirectRoutes(HttpControllerDescriptor controllerDescriptor, IReadOnlyList<HttpActionDescriptor> actionDescriptors, IInlineConstraintResolver constraintResolver)
+ {
+ var defaultDirectRouteProvider = new DefaultDirectRouteProvider();
+ var directRoutes = defaultDirectRouteProvider.GetDirectRoutes(controllerDescriptor, actionDescriptors, constraintResolver);
+ DirectRoutes = DirectRoutes?.Union(directRoutes).ToList() ?? directRoutes;
+ return directRoutes;
+ }
+ }
+
/// <summary>
/// コンフィグクラス
/// </summary>
public static class WebApiConfig
{
+ public static ObservableDirectRouteProvider GlobalObservableDirectRouteProvider = new ObservableDirectRouteProvider();
/// <summary>
/// コンフィグ登録
@@ -26,7 +44,7 @@ namespace Project
config.EnableCors(cors);
- config.MapHttpAttributeRoutes();
+ config.MapHttpAttributeRoutes(GlobalObservableDirectRouteProvider)
diff --git a/Project/Global.asax.cs b/Project/Global.asax.cs
index 12bab21..afa6c5d 100644
--- a/Project/Global.asax.cs
+++ b/Project/Global.asax.cs
@@ -24,6 +25,11 @@ namespace Project
protected void Application_Start()
{
GlobalConfiguration.Configure(WebApiConfig.Register);
+ var registeredRouteList = WebApiConfig.GlobalObservableDirectRouteProvider.DirectRoutes;
+ for (int i = 0; i < registeredRouteList.Count; i++)
+ {
+ System.Diagnostics.Debug.WriteLine(registeredRouteList[i].Route.RouteTemplate);
+ }
}