2010-11-05 82 views
2

我在OpenRasta的URL路由中遇到了很多困難,特別是當涉及到PUT請求時。如何在OpenRasta中明確指定方法綁定?

比方說,我有一個假設的UserContact處理程序,我需要用下面的簽名將其暴露:

//Create a new contact: 
POST /users/{userId}/contacts/create 

//Update a contact: 
PUT /users/{userId}/contact/{contactId}  

在這兩種情況下,請求主體包含聯繫人的形式編碼的參數。

在我Configuration.cs我:

ResourceSpace.Uses.PipelineContributor<HttpMethodOverriderContributor>(); 

ResourceSpace.Has.ResourcesOfType<ContactPost>() 
    .AtUri("https://stackoverflow.com/users/{userId}/contacts/create") 
    .And.AtUri("https://stackoverflow.com/users/{userId}/contacts/{contactId}") 
    .HandledBy<UserContactHandler>() 
    .AsXmlDataContract() 
    .And.AsJsonDataContract(); 

我的處理程序有兩種方法:

public OperationResult Post(int userId, ContactPost contact) 
public OperationResult Put(int userId, int contactId, ContactPost contact) 

我遇到兩個問題與此代碼:

  1. 許多客戶(以及我們的IIS服務器)不支持PUT/DELETE。最終,我想通過將上述兩個操作都設置爲POST來簡化此操作。不幸的是,只要我這樣做,OpenRasta無法確定我想要綁定哪種方法,而且兩者都不起作用 - 對於/ create和/ {contactId}請求,我將得到406不可接受。

  2. 然而如果予保持與上述代碼和客戶端通過X-HTTP-方法-覆蓋發送:PUT頭那麼/創建請求的作品,但是/ {的ContactID}請求還是返回406

它甚至沒有進入我的處理程序,所以我不知道從哪裏開始調試這樣的事情。

有沒有什麼辦法可以告訴OpenRasta將URL路由顯式映射到ASP.NET MVC中的某些方法?或者還有其他一些明顯的我在這裏做錯了嗎?

回答

5

您可以使用HttpOperation上的UriName和.Named()擴展方法來幫助OpenRasta路由到正確的方法。

對於你的第二個問題,你應該看看調試輸出,看看發生了什麼。

在一般情況下,OpenWrap試圖阻止您路由到方法,並儘可能地努力讓您爲不同的資源分開資源。

在您的示例中,您發佈的創建聯繫人的資源與聯繫人用戶的資源不同,因此應該可能有兩個不同的註冊。

+0

謝謝,但我不知道爲什麼這是一個不同的資源。 UserContact實體及其屬性在兩種情況下都完全相同。我真的想避免創建兩個完全相同的類,或者至少了解Resource的定義是什麼。 – realworldcoder 2010-11-05 20:46:00

+3

資源是一個具有一個URI並代表一個概念的東西。 「用戶列表」資源與「id xx用戶」資源不同,它與「i編輯用戶」資源也不同。因此/ users,/ users/21和/ users/21/edit都是不同的資源。那就是爲什麼你應該在註冊時爲每個人創建一個資源類,這就明確了區別。 – SerialSeb 2010-11-08 21:23:51

+0

+1我在建模資源和方法時遇到困難,此答案有助於澄清事物 – 2011-05-19 07:24:39