繁体   English   中英

Asp.NET Web API中的控制器和类列表

[英]List Of Controllers And Classes In Asp.NET Web API

我想访问我的web api中的所有控制器。 假设我有2个控制器和2个类;

Foo

string fooId

string fooName

酒吧

string barId

string barName

Sample1Controller

Get(int fooId)

Post([FromBody] Foo foo)

Sample2Controller

Get(int barId)

Post([FromBody] Bar bar)

我想列出我的控制器,Foo和Bar类的属性。 我怎样才能做到这一点 ?

更新

我想为移动应用程序创建请求和响应类。 例如,如果我远程访问这些详细信息,我可以为java或objective-c创建请求和响应类。

您可以使用ApiExplorer类,它是专门为Web API生成文档的类。

通常,它用于生成HTML帮助页面,但没有什么可以阻止您创建更多的机器可读输出,如JSON或XML。 如果您通过API操作方法公开输出,您将获得取决于所请求的类型,就像任何其他API方法一样。

有创建一个帮助页面的好文章在这里 ,但没有太多的物质围绕有关输出HTML以外任何东西。 不幸的是,ApiExplorer类不可序列化,因此您不能只返回对GetApiExplorer()的调用结果,但它足以创建我们自己的可序列化类,填充它们然后从API动作返回它们。

您可以使用GlobalConfiguration.Configuration.Services.GetApiExplorer().ApiDescriptions访问ApiExplorer类。 这将返回Collection<ApiDescription> ,其中包含有关控制器,操作和参数的信息。 如果您愿意,它甚至可以用于从任何///summary评论中访问文档。 这取决于您所使用的信息以及您希望的格式,但以下是使用此方法可以实现的示例:

首先,我创建了一个类来存储Action方法的详细信息:

[DataContract]
public class ActionMethod
{
    [DataMember]
    public string Name { get; set; }
    [DataMember]
    public List<Parameter> Parameters { get; set; }
    [DataMember]
    public string SupportedHttpMethods { get; set; }
}

请注意, SupportedHttpMethods只是一个string而不是List<T> 您可能希望将其改进为List<T>但对于此示例,我只是用逗号分隔它们以使生活稍微容易一些。

ActionMethod类有一个List<Parameter> ,如下所示:

[DataContract]
public class Parameter
{
    [DataMember]
    public string Name { get; set; }
    [DataMember]
    public string Source { get; set; } //where we pass the parameter when calling the action
    [DataMember]
    public string Type { get; set; }
    [DataMember]
    public List<Parameter> SubParameters { get; set; }

}

请注意, SubParameters用于存储复杂类型的成员变量类型。 我只捕获一层深度,但如果需要,可以很容易地扩展它。

然后,我创建了一个带有action方法的新Controller ,它将我们的API信息作为List<ActionMethod> 请注意,我添加了属性[ApiExplorerSettings(IgnoreApi = true)] ,它告诉ApiExplorer忽略此Controller任何内容,因此我们不会在我们的文档控制器上生成文档(这会起作用,但对我来说太元了!) 。

[ApiExplorerSettings(IgnoreApi = true)]
public class HelpController : ApiController
{
    public List<ActionMethod> Get()
    {
        var apiActions = new List<ActionMethod>();

        Collection<ApiDescription> apiDescriptions = GlobalConfiguration
                           .Configuration
                           .Services
                           .GetApiExplorer()
                           .ApiDescriptions;

        foreach (var api in apiDescriptions)
        {
            List<Parameter> parameters = new List<Parameter>();
            //get the parameters for this ActionMethod
            foreach (var parameterDescription in api.ParameterDescriptions)
            {
                Parameter parameter = new Parameter()
                {
                    Name = parameterDescription.Name, 
                    Source = parameterDescription.Source.ToString(),
                    Type = parameterDescription.ParameterDescriptor.ParameterType.ToString(),
                    SubParameters = new List<Parameter>()
                };
                //get any Sub-Parameters (for complex types; this should probably be recursive)
                foreach (var subProperty in parameterDescription.ParameterDescriptor.ParameterType.GetProperties())
                {
                    parameter.SubParameters.Add(new Parameter()
                    {
                        Name = subProperty.Name,
                        Type = subProperty.PropertyType.ToString()
                    });
                }

                parameters.Add(parameter);
            }
            //add a new action to our list
            apiActions.Add(new ActionMethod()
            {
                Name = api.ActionDescriptor.ControllerDescriptor.ControllerName,
                Parameters = parameters, 
                SupportedHttpMethods = string.Join(",", api.ActionDescriptor.SupportedHttpMethods)
            });
        }

        return apiActions;
    }
}

然后我们可以访问/api/help的api文档。 使用您在问题中提供的控制器和操作方法示例,请求JSON给出如下响应:

[
   {
      "Name":"Bar",
      "Parameters":[
         {
            "Name":"barId",
            "Source":"FromUri",
            "Type":"System.Int32",
            "SubParameters":[

            ]
         }
      ],
      "SupportedHttpMethods":"GET"
   },
   {
      "Name":"Bar",
      "Parameters":[
         {
            "Name":"bar",
            "Source":"FromBody",
            "Type":"ApiTest.Controllers.Bar",
            "SubParameters":[
               {
                  "Name":"barId",
                  "Source":null,
                  "Type":"System.String",
                  "SubParameters":null
               },
               {
                  "Name":"barName",
                  "Source":null,
                  "Type":"System.String",
                  "SubParameters":null
               }
            ]
         }
      ],
      "SupportedHttpMethods":"POST"
   },
   {
      "Name":"Foo",
      "Parameters":[
         {
            "Name":"fooId",
            "Source":"FromUri",
            "Type":"System.Int32",
            "SubParameters":[

            ]
         }
      ],
      "SupportedHttpMethods":"GET"
   },
   {
      "Name":"Foo",
      "Parameters":[
         {
            "Name":"foo",
            "Source":"FromBody",
            "Type":"ApiTest.Controllers.Foo",
            "SubParameters":[
               {
                  "Name":"fooId",
                  "Source":null,
                  "Type":"System.String",
                  "SubParameters":null
               },
               {
                  "Name":"fooName",
                  "Source":null,
                  "Type":"System.String",
                  "SubParameters":null
               }
            ]
         }
      ],
      "SupportedHttpMethods":"POST"
   }
]

并要求XML给我们:

<?xml version="1.0" encoding="UTF-8"?>
<ArrayOfActionMethod xmlns="http://schemas.datacontract.org/2004/07/ApiTest.Controllers" 
                     xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
    <ActionMethod>
        <Name>Bar</Name>
        <Parameters>
            <Parameter>
                <Name>barId</Name>
                <Source>FromUri</Source>
                <SubParameters />
                <Type>System.Int32</Type>
            </Parameter>
        </Parameters>
        <SupportedHttpMethods>GET</SupportedHttpMethods>
    </ActionMethod>
    <ActionMethod>
        <Name>Bar</Name>
        <Parameters>
            <Parameter>
                <Name>bar</Name>
                <Source>FromBody</Source>
                <SubParameters>
                    <Parameter>
                        <Name>barId</Name>
                        <Source i:nil="true" />
                        <SubParameters i:nil="true" />
                        <Type>System.String</Type>
                    </Parameter>
                    <Parameter>
                        <Name>barName</Name>
                        <Source i:nil="true" />
                        <SubParameters i:nil="true" />
                        <Type>System.String</Type>
                    </Parameter>
                </SubParameters>
                <Type>ApiTest.Controllers.Bar</Type>
            </Parameter>
        </Parameters>
        <SupportedHttpMethods>POST</SupportedHttpMethods>
    </ActionMethod>
    <ActionMethod>
        <Name>Foo</Name>
        <Parameters>
            <Parameter>
                <Name>fooId</Name>
                <Source>FromUri</Source>
                <SubParameters />
                <Type>System.Int32</Type>
            </Parameter>
        </Parameters>
        <SupportedHttpMethods>GET</SupportedHttpMethods>
    </ActionMethod>
    <ActionMethod>
        <Name>Foo</Name>
        <Parameters>
            <Parameter>
                <Name>foo</Name>
                <Source>FromBody</Source>
                <SubParameters>
                    <Parameter>
                        <Name>fooId</Name>
                        <Source i:nil="true" />
                        <SubParameters i:nil="true" />
                        <Type>System.String</Type>
                    </Parameter>
                    <Parameter>
                        <Name>fooName</Name>
                        <Source i:nil="true" />
                        <SubParameters i:nil="true" />
                        <Type>System.String</Type>
                    </Parameter>
                </SubParameters>
                <Type>ApiTest.Controllers.Foo</Type>
            </Parameter>
        </Parameters>
        <SupportedHttpMethods>POST</SupportedHttpMethods>
    </ActionMethod>
</ArrayOfActionMethod>

有关ApiExplorer类的更多信息可以在MSDN上找到。

要获取包含控制器的程序集,请向其中一个控制器添加操作,以便在执行时可以获取程序集:

var types = GetType().Assembly.GetTypes();

现在,您可以遍历这些类型并进行测试以查看它是什么类型。 如果所有控制器都实现了公共接口或扩展了公共类等...您还可以测试命名空间..

例如:

for (var t in types)
{
   if (t.IsSubClassOf(typeof( ApiController))){  .... }
}

这是一个教程/示例:

如何获取实现IMyInterface的引用中的所有类型

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM