获取路由名称的HTTP方法

时间:2017-10-09 14:37:45

标签: asp.net-core asp.net-core-webapi asp.net-core-routing

我想输出用户可以用于特定路由名称的HTTP方法列表。

E.g。

[HttpGet("somethingcool",Name="name"]
public IActionResult Get(){ Ok(); }

[HttpPost("somethingcool",Name="name"]
public IActionResult Post(){ Ok(); }

当我尝试获取路由name可以接受的HTTP方法时,我想看到GET,POST

有什么想法吗?

2 个答案:

答案 0 :(得分:1)

MS提供NuGet包以反映您的代码并找到您的api支持的方法。点击此处:MSDN | Creating Help Pages for ASP.NET Web API

然后在您的控制器中,您可以从

获取信息
Configuration.Services.GetApiExplorer().ApiDescriptions

我假设您要向客户端公开方法列表。为此,您应该使用为此目的而制作的OPTIONS动词:MDN | OPTIONS

答案 1 :(得分:0)

在概念中,你要求做的事情是不可能的。这是因为单个路径可以引用任意数量的动作方法。命名路由也是可选的。路由主要用于匹配当前请求,因此获取与任何可能请求匹配的所有路由的列表不是内置于路由的内容。

但是,如果您只使用属性路由,则可以使用Reflection扫描控制器类中的HttpGetHttpPost属性,然后通过Name属性过滤属性列表。

var classes = assembly.GetTypes().Where(t => t.GetTypeInfo().IsClass && t.Name.EndsWith("Controller"));

foreach (var c in classes)
{
    var methods = c.GetMethods(BindingFlags.Public | BindingFlags.Instance);

     foreach (var method in methods)
     {
         var getAtt = method.GetCustomAttribute(typeof(HttpGetAttribute));
         var postAtt = method.GetCustomAttribute(typeof(HttpPostAttribute));

         // Check whether they are null and add metadata to your result list
     }
}

如果使用基于约定的路由,则需要使用自定义属性标记引用基于约定的路由的方法,以指示它对应的路径。

[RouteName("default")]

然后扫描该属性的方式与HttpGetHttpPost的方式类似。但是你必须努力确保每个路由实际上都有一个名称,并且每个方法都有一个可能的属性要搜索才能使它工作。