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

Mel*_*cuk 5 c# asp.net wsdl service-discovery asp.net-web-api

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

Foo:

string fooId

string fooName
Run Code Online (Sandbox Code Playgroud)

酒吧:

string barId

string barName
Run Code Online (Sandbox Code Playgroud)

Sample1Controller:

Get(int fooId)

Post([FromBody] Foo foo)
Run Code Online (Sandbox Code Playgroud)

Sample2Controller:

Get(int barId)

Post([FromBody] Bar bar)
Run Code Online (Sandbox Code Playgroud)

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

更新:

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

pet*_*ids 7

您可以使用ApiExplorer专门设计的类来生成Web API的文档.

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

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

您可以使用访问ApiExplorerGlobalConfiguration.Configuration.Services.GetApiExplorer().ApiDescriptions.这将返回一个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; }
}
Run Code Online (Sandbox Code Playgroud)

请注意,这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; }

}
Run Code Online (Sandbox Code Playgroud)

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

然后,我创建了一个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;
    }
}
Run Code Online (Sandbox Code Playgroud)

然后我们可以访问api文档/api/help.使用您在问题中提供的控制器和操作方法示例,请求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"
   }
]
Run Code Online (Sandbox Code Playgroud)

并要求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>
Run Code Online (Sandbox Code Playgroud)

有关该ApiExplorer课程的更多信息可以在MSDN上找到.