2017-10-09 140 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