2017-10-09 137 views
1

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

E.g.

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

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

当我试图让HTTP方法那条路线name可以接受,我想看看GET,POST

任何想法?

+0

您应该看'HEAD'。我认为这个答案可以帮助你https://stackoverflow.com/questions/3181500/respond-to-http-head-requests-using-asp-net-mvc – anserk

+0

@anserk HEAD不是为了这个。选项是。 –

+0

@EsbenSkovPedersen你说得对。 – anserk

回答

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。但是,您必须勤奋确保每条路线实际上都有一个名称,并且每种方法都有可能搜索的属性之一才能使其工作。

+0

感谢您的支持!我管理使用'method.GetCustomAttribute (true)?。HttpMethods' – chris31389

1

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

然后在你控制器,你可以从

Configuration.Services.GetApiExplorer().ApiDescriptions 

得到的信息我假设你想要公开的方法,以客户名单。为此,您应该使用OPTIONS动词,该动词恰恰是用于此目的:MDN | OPTIONS