如何获取 ApiController 的所有操作列表

Posted

技术标签:

【中文标题】如何获取 ApiController 的所有操作列表【英文标题】:How can I get the list of all actions of ApiController 【发布时间】:2015-01-21 14:07:27 【问题描述】:

我尝试使用此代码,但它不起作用(返回空列表)

var controllerDescriptor = new ReflectedControllerDescriptor(controller);
ActionDescriptor[] actions = controllerDescriptor.GetCanonicalActions();

【问题讨论】:

【参考方案1】:

研究了如何获取 ApiController 方法签名而不是 Controller。

        string Items = "";
        IEnumerable<Assembly> Assemblies = BuildManager.GetReferencedAssemblies().Cast<Assembly>();

        foreach (Assembly FoundAssembly in Assemblies)
        
            string AssemblyName = FoundAssembly.FullName;
            IEnumerable<TypeInfo> Types = FoundAssembly.DefinedTypes.Where(type => type != null && type.IsPublic && type.IsClass && !type.IsAbstract && typeof(ApiController).IsAssignableFrom(type));
            foreach (TypeInfo ControllerType in Types)
            
                System.Web.Http.Controllers.ApiControllerActionSelector ApiControllerSelection = new System.Web.Http.Controllers.ApiControllerActionSelector();
                System.Web.Http.Controllers.HttpControllerDescriptor ApiDescriptor = new System.Web.Http.Controllers.HttpControllerDescriptor(new System.Web.Http.HttpConfiguration(), ControllerType.Name, ControllerType);
                ILookup<string, System.Web.Http.Controllers.HttpActionDescriptor> ApiMappings = ApiControllerSelection.GetActionMapping(ApiDescriptor);

                foreach (var Maps in ApiMappings)
                
                    foreach (System.Web.Http.Controllers.HttpActionDescriptor Actions in Maps)
                    
                        Items += "[ controller=" + ControllerType.Name + " action=" + ((System.Web.Http.Controllers.ReflectedHttpActionDescriptor)(Actions)).MethodInfo + "]";
                    
                
            
        

输出:

[ controller=CarController action=System.Net.Http.HttpResponseMessage Login()]
[ controller=CarController action=Void MyCustomGet()]
[ controller=CarController action=Void MyCustomPost()]
[ controller=GenericControllerApi action=System.Net.Http.HttpResponseMessage Login()]
[ controller=ValuesController action=System.String Get()]
[ controller=ValuesController action=System.String Get(Int32)]
[ controller=ValuesController action=Void Post(System.String)]
[ controller=ValuesController action=Void Put(Int32, System.String)]
[ controller=ValuesController action=Void Delete(Int32)]
[ controller=ODataMetadataController action=Microsoft.Data.Edm.IEdmModel GetMetadata()]
[ controller=ODataMetadataController action=Microsoft.Data.OData.ODataWorkspace GetServiceDocument()]

我没有创建一个额外的控制器“ODataMetadataController”。可能由初始项目创建添加。我也没有看这是否可以简化。

【讨论】:

我从程序集中获取所有 apiControllers,然后尝试从 foreach BuildManager.GetReferencedAssemblies().Where(type =&gt; type != null &amp;&amp; type.IsPublic &amp;&amp; type.IsClass &amp;&amp; !type.IsAbstract &amp;&amp; typeof(ApiController).IsAssignableFrom(type)中的当前类型(apiController)获取操作 foreach (var controller in GetControllers()) var controllerDescriptor = new ReflectedControllerDescriptor(controller); 我仍在寻找解决此问题的方法 - 就我而言,我怀疑它不起作用,因为 ReflectedControllerDescriptor 来自 .Net MVC 库,而 ApiController 来自较新的 (&单独的)Web API 库。 我相信你是对的。将 typeof(ApiController) 切换为 typeof(Controller) 以获取 MVC 控制器将填写动作名称。

以上是关于如何获取 ApiController 的所有操作列表的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 ApiController 返回原始字符串?

将所有 POST 请求路由到单个 ApiController

无法从 apicontroller 中的 OwinContext 获取 UserManager

仅将操作过滤器添加到 [ApiController] 注释控制器的操作?

无法在 auth 子文件夹中访问我的 apicontroller

Ext JS:获取特定行的操作列