gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 22:22:24 25 4
gpt4 key购买 nike

我想访问我的网络 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com