获取路由名称的 HTTP 方法

Get the HTTP Method(s) for a Route name

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

例如

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

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

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

有什么想法吗?

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

但是,如果您只使用属性路由,则可以使用反射扫描控制器 HttpGetHttpPost 属性 类,然后按名称过滤属性列表属性.

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 一样扫描该属性。但是您必须努力确保每条路线实际上都有一个名称,并且每个方法都有一个可能的属性来搜索以使其工作。

MS 提供了一个 NuGet 包来反映您的代码并找到您的 api 支持的方法。在此处查看更多信息:MSDN | Creating Help Pages for ASP.NET Web API

然后在你的控制器中你可以从

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

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