![](/img/trans.png)
[英]Controllers With Same Name In Different NameSpace 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))){ .... }
}
这是一个教程/示例:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.