我在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)
我遇到兩個問題與此代碼:
許多客戶(以及我們的IIS服務器)不支持PUT/DELETE。最終,我想通過將上述兩個操作都設置爲POST來簡化此操作。不幸的是,只要我這樣做,OpenRasta無法確定我想要綁定哪種方法,而且兩者都不起作用 - 對於/ create和/ {contactId}請求,我將得到406不可接受。
然而如果予保持與上述代碼和客戶端通過X-HTTP-方法-覆蓋發送:PUT頭那麼/創建請求的作品,但是/ {的ContactID}請求還是返回406
它甚至沒有進入我的處理程序,所以我不知道從哪裏開始調試這樣的事情。
有沒有什麼辦法可以告訴OpenRasta將URL路由顯式映射到ASP.NET MVC中的某些方法?或者還有其他一些明顯的我在這裏做錯了嗎?
謝謝,但我不知道爲什麼這是一個不同的資源。 UserContact實體及其屬性在兩種情況下都完全相同。我真的想避免創建兩個完全相同的類,或者至少了解Resource的定義是什麼。 – realworldcoder 2010-11-05 20:46:00
資源是一個具有一個URI並代表一個概念的東西。 「用戶列表」資源與「id xx用戶」資源不同,它與「i編輯用戶」資源也不同。因此/ users,/ users/21和/ users/21/edit都是不同的資源。那就是爲什麼你應該在註冊時爲每個人創建一個資源類,這就明確了區別。 – SerialSeb 2010-11-08 21:23:51
+1我在建模資源和方法時遇到困難,此答案有助於澄清事物 – 2011-05-19 07:24:39