如何解决ASP.NET Core-从控制器类型获取路由
如何从控制器类型获取路由?
例如,从某种服务或其他服务获取MyTestController
和LoosedController
的路由。
XService.GetRoute<MyTestController>(); // output: /api/x/MyTest
XService.GetRoute<LoosedController>(); // output: /api/loosed-items
[Route("api/x/[controller]")]
public abstract class MyControllerBase : ControllerBase {
[HttpGet("{id}")]
public ActionResult Get(int id) {
return Ok(id);
}
}
[Route("api/loosed-items")]
public class LoosedController : MyControllerBase {
}
public class MyTestController : MyControllerBase {
[HttpGet("action")]
public ActionResult FindThis() {
return Ok();
}
}
解决方法
根据您的描述,您可以尝试使用IActionDescriptorCollectionProvider
获取所有控制器路由。
更多详细信息,您可以参考以下代码:
接口:
public interface IGetRoute
{
IList<RouteModel> GetRotue(string type);
}
班级: 公共类GetRoute:IGetRoute { 私有只读IActionDescriptorCollectionProvider _actionDescriptorCollectionProvider;
public GetRoute(IActionDescriptorCollectionProvider actionDescriptorCollectionProvider)
{
_actionDescriptorCollectionProvider = actionDescriptorCollectionProvider;
}
public IList<RouteModel> GetRotue(string type)
{
var typename = type.Replace("Controller","");
List<RouteModel> result = new List<RouteModel>();
foreach (ActionDescriptor _e in _actionDescriptorCollectionProvider.ActionDescriptors.Items)
{
if (_e.AttributeRouteInfo != null)
{
if (_e.AttributeRouteInfo.Template.Contains(typename))
{
result.Add(new RouteModel() { Name = _e.AttributeRouteInfo.Template,ControllerName = typename });
}
} else if (_e is ControllerActionDescriptor)
{
var e = _e as ControllerActionDescriptor;
if (e.ControllerName == typename)
{
result.Add(new RouteModel() { Name = $"/{e.ControllerName}/{e.ActionName}",ControllerName = typename });
}
}
}
return result;
}
}
在ConfigureServices方法中注册:
services.AddScoped<IGetRoute,GetRoute>();
用法:
var res = _route.GetRotue(typeof(MyTestController).Name);
var res2 = _route.GetRotue(typeof(HomeController).Name);
结果:
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。