Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/30.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 当'RoutePrefix'或'Route'属性未使用时,获取所有路由的列表(ASP.NET)_C#_Asp.net_Asp.net Web Api - Fatal编程技术网

C# 当'RoutePrefix'或'Route'属性未使用时,获取所有路由的列表(ASP.NET)

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

我有如下几个路由模板和许多控制器,其中包括几个端点

项目\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} ; } } 如何根据现有控制器及其方法获取所有路由端点的列表

我希望得到类似于:

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);
+            }
         }