2012-09-10 72 views
1

我正在寫一個REST API,並有以下問題:的.NET Web API - 幾個GET和POST方法

與資源/消息/,我在我的MessageController以下方法:

[HttpGet] 
// retrieves all messages for a user 
public HttpResponseMessage GetMessages(Guid RecordId) {} 

[HttpGet] 
// retrieves only a single messages, specified by guid 
public HttpResponseMessage GetMessage(Guid RecordId) {} 

在我WebApiConfig.cs我有以下路徑:

config.Routes.MapHttpRoute(
    name: "MessageRouting", 
    routeTemplate: "messages/{RecordId}/", 
    defaults: new { controller = "Message", RecordId= RouteParameter.Optional } 
); 

這當然是失敗,因爲路由不知道該調用哪個方法。 這裏的問題是,保持平安,我想避免額外的查詢參數,如

GET /messages/?userid=1 

如果我寧願從拉的accessToken用戶ID和調用的getMessages如下?

GET /messages 
AccessToken=foo 

我會使用遇到了同樣的問題[HttpPost]和[HttpPut]以及 - 我總有某一託收或單個項目,我想工作,所以對於每個HTTP方法我會至少有2種方法可以調用。

我沒有移動一個GetMessages()方法到UserController的選項,因爲那裏我會遇到同樣的問題 - 看起來用Web Api,一個控制器只能有每個HTTP方法定義一個單一時間,這使得與集合與單個項目合作非常困難。

我剩下的REST風格,並具有網址唯一標識資源之間的一個小撕裂,但似乎.NET這裏不給我一個選擇,我不能指定路由的HTTP方法。或者我可以嗎?

回答

3

找到解決方案 - 在WebApiConfig.cs中,可以爲路由指定「名稱」屬性。此屬性可用於註釋方法,如:

public class MessageController() { 

    [ActionName("MultipleMessages")] 
    [HttpGet] 
    public HttpResponseMessage GetMessages(Guid UserId) {} 

    [ActionName("SingleMessage")] 
    [HttpGet] 
    public HttpResponseMessage GetMessage(Guid MessageId) {} 

} 

這樣,您可以在同一個控制器中擁有多個GET或POST方法。調用這些方法的路線如下所示:

// multiple messages, will call MessageController.GetMessages() 
config.Routes.MapHttpRoute(
    name: "MultipleMessages", 
    routeTemplate: "users/{UserId}/messages", 
    defaults: new { controller = "Message", UserId = RouteParameter.Optional } 
); 

// single messages, will call MessageController.GetMessage() 
config.Routes.MapHttpRoute(
    name: "SingleMessage", 
    routeTemplate: "messages/{MessageId}/", 
    defaults: new { controller = "Message", MessageId = RouteParameter.Optional } 
); 
+0

輝煌。我認爲[ActionName]只對應於defaults參數上的'action'屬性。這是一種享受。 –