ASP.NET WebAPI-如何扫描已注册的操作
本文关键字:注册 操作 扫描 WebAPI- NET 何扫描 ASP | 更新日期: 2023-09-27 18:19:40
我的WebApi中有几个方法返回HttpResponseMessage。由于响应类型未知,我必须使用之类的东西在HelpPageConfig中注册它们
config.SetActualResponseType(typeof(X), "SomeController", "GetX");
我想使用自定义属性[ActualResponse(typeof(X)]
来注册这些,其中声明了控制器,以避免创建一个引用有点混乱列表中所有内容的大型注册表对象。
如何查询配置以获得已注册控制器、操作及其属性的列表,以便自动调用SetActualResponseType?
我已经探索了mvc和webapi的来源,但没有找到可以注入这种逻辑的地方。在mvc/webapi中搜索动作方法不是一件容易的事,因为有很多检查可以确定方法是动作方法还是常规方法(基于注册的路由等)。在您的情况下,您必须只处理具有自定义ActualResponse属性的方法,对吗?所以你可以通过反思来做到这一点。当然,这样的事情并不快,也会带来一些性能上的打击。但如果你在Application_Start上运行一次这样的逻辑,我认为这是可以接受的。
实施示例:
public static class ActionMethodsRegistrator
{
private static readonly Type ApiControllerType = typeof(IHttpController);
public static void RegisterActionMethods(YourCustomConfig config)
{
// find all api controllers in executing assembly
var contollersTypes = Assembly.GetExecutingAssembly().GetTypes()
.Where(foundType => ApiControllerType.IsAssignableFrom(foundType));
// you may also search for controllers in all loaded assemblies e.g.
// var contollersTypes = AppDomain.CurrentDomain.GetAssemblies()
// .SelectMany(s => s.GetTypes())
// .Where(foundType => ApiControllerType.IsAssignableFrom(foundType));
foreach (var contollerType in contollersTypes)
{
// you may add more restriction here for optimization, e. g. BindingFlags.DeclaredOnly
// I took search parameters from mvc/web api sources.
var allMethods = contollerType.GetMethods(BindingFlags.Instance | BindingFlags.Public);
foreach (var methodInfo in allMethods)
{
var actualResponseAttrubute = methodInfo.GetCustomAttribute<ActualResponseAttribute>();
if (actualResponseAttrubute != null)
{
config.SetActualResponseType(actualResponseAttrubute.Type, contollerType.Name, methodInfo.Name);
}
}
}
}
}
Global.asax文件:
protected void Application_Start()
{
//....
YourCustomConfig config = InitializeConfig();
ActionMethodsRegistrator.RegisterActionMethods(config);
}