2015-07-19 73 views
4

嘗試了表控制器和自定義控制器,但無法使用相同的http方法定義接受相同參數的兩個函數。聲明如何在使用.NET作爲後端時在Azure Mobile Service中定義自定義api路由?

public Person GetMemberDetails(int id) 
{ 
    // Some Code 
    return person; 
} 

public Person GetMemberAddress(int id) 
{ 
    // Some Code 
    return person; 
} 

例如,當作爲兩個函數使用GET請求,並都有建設項目我不能夠使用它們的後兩種相同的輸入。當我刪除一個或修改一個使用任何其他請求方法,我可以從中請求。

http://<azure-mobile-service-name>/Person/{id} 

有什麼辦法可以用相同的簽名和相同的請求方法聲明兩個函數嗎?

回答

3

您需要使用路由屬性,如:

[Route("api/getdetails")] 
public Person GetMemberDetails(int id) 
{ 
    // Some Code 
    return person; 
} 
[Route("api/getaddress")] 
public Person GetMemberAddress(int id) 
{ 
    // Some Code 
    return person; 
} 

或搜索「屬性路由」,如果你想在路線ID

+0

還要注意,您需要使用Mobile Services APIController而不是TableController,因爲TableController爲你設置了一些路由。 –

1

根據RESTful原則,對於具有一個特定簽名的動詞只能有一種方法。但是你總是可以修改你的路由並實現它,但你不會堅持使用REST。在某些情況下,如果情況要求,那麼可以這樣做。 參考這篇文章Multiple HttpPost method in Web API controller

+0

你能鏈接到一些權威性的文件,證實REST不允許控制器上有多個GET? OP的問題是單個HTTP GET(路由)不明確,所以Web API處於錯誤狀態。 – Sentinel

+0

請參閱以下網址:http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html https://github.com/flask-restful/flask-restful/issues/114 http://salesforce.stackexchange .com/questions/5693/can-we-create-multiple-http-methods-rest-annotations-of-the-same-type-in​​-a-si – Aravind

4

我已經花了幾個小時試圖在Azure應用服務中獲得多種發佈方法(請注意,應用服務取代了移動服務,編號:Upgrade your existing .NET Azure Mobile Service to App Service)。

一般的解決方案可以在上述的Multiple HttpPost method in Web API controller中找到。然而,在應用服務的情況下,有一個非常重要的評論。 在官方微軟樣品(參照Work with the .NET backend server SDK for Azure Mobile Apps)默認的配置被提議爲:

HttpConfiguration config = new HttpConfiguration(); 

new MobileAppConfiguration() 
    .UseDefaultConfiguration() 
    .ApplyTo(config); 

不幸UseDefaultConfiguration()方法調用MapApiControllers(),它定義了標準路由 「API/{控制器} /(編號)」對{id}沒有限制。這種路由與「api/{controller}/{action}」不兼容。所以,如果有人想使用多個崗位的方法,標準配置應改爲:

HttpConfiguration config = new HttpConfiguration(); 

new MobileAppConfiguration() 
    .AddTables(new MobileAppTableConfiguration().MapTableControllers().AddEntityFramework()).AddMobileAppHomeController().AddPushNotifications() 
    .ApplyTo(config); 
config.Routes.MapHttpRoute("ActionApi", "api/{controller}/{action}"); 

當然是可以使用「API/{控制器}/{行動}/{ID}」的路線,而不是,也可選{id}。

我希望我的調查可以節省很多小時的神經。如果微軟的某人閱讀了這篇文章 - 請在默認示例中稍作評論,或者更好地向UseDefaultConfiguration添加一個參數,以決定是否使用「api/{controller}/{action}」路由。

+1

謝謝!我一直試圖通過大量的谷歌搜索讓它工作3-4個小時。你的帖子解決了我的問題。但請注意:不應該將MapTableControllers用於MobileAppTable配置,而不適用於MapApiControllers? –

+0

是的Stefan,你說得對。我在我的帖子中更正了代碼。謝謝。 –

+0

不要忘記使用:config.MapHttpAttributeRoutes(); 否則屬性將被忽略... – Inna