2015-12-14 80 views
7

我有一個asp.net web api控制器,裏面有2個GET方法。一個接受一個字符串參數,另一個接受一個int參數。我只有默認路由,它是通過web api設置的。你可以在同一個web api控制器中擁有2個不同參數類型的GET方法嗎?

 public HttpResponseMessage GetSearchResults(string searchTerm) 
     { 
      HttpResponseMessage response; 
      //Do Work 
      return response; 
     } 

     public HttpResponseMessage Get(int id) 
     { 
      HttpResponseMessage response; 
      //Do Work 
      return response; 
     } 

每當我在URL中傳遞一個int值時,將調用接受字符串參數的GET方法。從不調用接受int參數的GET方法。

是否有可能在同一個控制器中有兩個不同參數類型的GET方法?

-Edit- 建議的重複問題是不同的,因爲它詢問了兩個完全相同參數類型的方法 - 我詢問了不同的參數類型。

回答

14

是的,這是可能的。默認配置開箱即用,假設您將searchTerm作爲查詢字符串參數傳遞,您應具備哪些功能。但是,如果您試圖將其作爲URL的一部分傳遞,例如/api/myurl/blah,默認約定路由將嘗試將其與該方法的int版本匹配並返回錯誤。您將不得不編輯默認配置或使用Attribute Routing

一般來說,我發現基於約定的MVC路由在WebApi中不太有用,所以我通常禁用它並使用Attribute Routing

要啓用屬性的路由,加

config.MapHttpAttributeRoutes(); 

您的WebAPI的配置。

然後,你可以這樣

[HttpGet] 
[Route("api/myobject/")] 
public HttpResponseMessage GetSearchResults(string searchTerm) 
{ 
    HttpResponseMessage response; 
    //Do Work 
    return response; 
} 

[HttpGet] 
[Route("api/myobject/{id:int}")] 
public HttpResponseMessage Get(int id) 
{ 
    HttpResponseMessage response; 
    //Do Work 
    return response; 
} 

你的方法標記現在,你可以通過

/api/myobject?searchTerm=blah 

,並通過

/api/myobject/1 

,他們不該第二調用第一個方法不會相互碰撞。

不過,如果你想擁有searchTerm是網址,而不是查詢參數,您可以將路線更改爲

[Route("api/myobject/{searchTerm}")] 

api/myobject/{id:int}路線將捕獲所有的ID和api/myobject/{searchTerm}將趕上最還要別的嗎。不過,要小心這個URL,如果URL不是URL編碼,怪異的東西就會傾向於發生。

我不知道你正在尋找什麼URL格式,所以我提供的只是簡單的例子。我之前發佈的link深入研究了屬性路由。它允許你創建更復雜的路由,而不是按照約定路由WebApi從MVC繼承。

+0

優秀的解釋 - 屬性路由工作完美! – Aaron

+0

沒問題。很高興幫助。 –

相關問題