c# - Asp.NET Web API 中的 Controller 和类列表

标签 c# asp.net asp.net-web-api wsdl service-discovery

我想访问我的网络 API 中的所有 Controller 。假设我有 2 个 Controller 和 2 个类;

:

string fooId

string fooName

:

string barId

string barName

Sample1Controller:

Get(int fooId)

Post([FromBody] Foo foo)

Sample2Controller:

Get(int barId)

Post([FromBody] Bar bar)

我想列出我的 Controller 、Foo 和 Bar 类及其属性。我该怎么做?

更新:

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

最佳答案

您可以使用 ApiExplorer class 是专门设计用于生成 Web API 文档的类。

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

有一篇关于创建帮助页面的好文章 here但是关于输出 HTML 以外的任何内容的资料并不多。不幸的是,ApiExplorer 类不可序列化,因此您不能只返回对 GetApiExplorer() 的调用结果。但是创建我们自己的可序列化类、填充它们然后从 API 操作返回这些类已经足够简单了。

您可以访问 ApiExplorer使用 GlobalConfiguration.Configuration.Services.GetApiExplorer().ApiDescriptions 上课.这将返回 Collection<ApiDescription>其中包含有关 Controller 、操作和参数的信息。它甚至可以用于从任何 ///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用于存储复杂类型的成员变量的类型。我只捕获了一层深度,但如果需要,扩展它会很容易。

然后,我创建了一个新的 Controller使用将我们的 API 信息作为 List<ActionMethod> 返回的操作方法.请注意,我添加了属性 [ApiExplorerSettings(IgnoreApi = true)]这告诉 ApiExplorer忽略此 Controller 中的任何内容所以我们不会在我们的记录 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 文档.使用您在问题中给出的 Controller 和操作方法作为示例,请求 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 上找到.

关于c# - Asp.NET Web API 中的 Controller 和类列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25206833/

相关文章:

c# - 在 web.config 文件中使用授权时被重定向回登录屏幕

javascript - 为什么 $(this).data ('mycontrol' ) 未定义?

c# - 在回调请求上保留 ViewState

c# - Validator.TryValidateObject 不验证属性

c# - Enterprise Library 4.1 Logger,日志在哪里?

c# - 如何在 C# 中捕获包含匿名方法的 Action 的异常?

Asp.net Web API : No action was found on the controller

authentication - API 身份验证的最佳实践是什么?

c# - 将日期时间更改为午夜

c# - XDocument.ToString() 删除 XML 编码标签