2009-09-07 109 views
10

我們正在使用REST WCF服務。 我們希望此REST服務的保存操作處於事務中。 有沒有辦法通過電線將事務對象傳遞給REST WCF服務?REST WCF服務中的事務

回答

13

這裏是羅伊·菲爾丁,誰發明了術語REST

如果你發現自己需要一個 分佈式事務協議的傢伙報價,然後 你怎麼可能說你的 架構是基於REST的?我 根本看不出你如何能得到從 一個情況的 接下來的形勢需要的 事務語義分佈式協定,其中 客戶端(通過客戶端與 超媒體在RESTful的 應用程序的狀態,以確定所有的狀態 過渡)必須告訴服務器如何管理自己的資源。

......現在我認爲「休息交易」 是一個矛盾。

這是從6月9日的REST的討論列表上的message,2009年

+0

好的,所以Fielding應該解釋(清楚地說,這是一個任務本身),我該如何告訴服務器:創建這兩個資源,但同時,不是先創建這個資源,而是這個其他資源。 – 2009-11-04 00:46:35

+3

POST/MyResourcePairs 我給你一個更真實的例子,但你會發現,在大多數情況下,事務需要發生,有一個名詞用戶用來引用該事件。因此,從最終用戶的角度來看,你所描述的很少存在。 – 2009-11-04 01:54:12

+0

換句話說,它會違反無狀態約束。 – inf3rno 2015-10-12 11:17:41

1

WCF中的事務處理支持是通過許多WS- *標準之一處理的,而這些標準只適用於SOAP--我非常懷疑webHttpBinding本身將支持事務。

但是,您可能想要檢查ADO.NET Dataservices,它們是WCF REST之上的圖層。

請參閱ADO.NET DataServices團隊的blog post

馬克

0

這裏的話題最近的討論:http://social.msdn.microsoft.com/Forums/en-US/adodotnetdataservices/thread/e66651c0-9202-4049-a8f4-55971b8b359d

基本上它說:一個請求不支持事務並且支持它們是沒有意義的,因爲在一個POST/PUT/DELETE請求中只涉及一個實體和CUD操作。

  • 使用批處理請求(在一個步驟中被髮送POST的整束/ PUT/DELETE請求從客戶機到服務器)
  • 和利用處理:但是事務可以在服務器側通過來實現管道(在處理事件開始事務並提交/在加工事件回滾事務)
2

我大多同意羅伊菲爾丁在達雷爾的回答引用。您絕對不應該通過REST風格的Web服務公開應用程序管道,例如數據庫事務。但是,您可以以更實用的方式處理分佈式事務。

假設您正在實施可以收集購物禮券的銷售點系統。客戶應該能夠將禮券與信用卡付款結合起來。禮券和信用卡付款均由銷售點外部的系統處理。收集禮券和進行信用卡付款應該是原子交易。爲了讓事情變得簡單,讓我們關注一個案例:客戶首先會收集禮券,並用信用卡支付餘額。信用卡支付可能會失敗,因此您還想在此情況下回滾禮券憑證。

禮券服務公開的URL發起集合:

/gift-voucher/{gift-voucher-id}/collection 

請求這個URL將創建並持續禮券預訂。響應包含一個URL,以保留:

/gift-voucher/{gift-voucher-id}/collection/reservation/${reservation-id} 

這個URL可以是張貼或刪除,以便分別執行或取消的禮品券集合。

請注意,此方法只能用於有功能用例回滾事務(即失敗的信用卡付款)的應用程序服務。試圖將此應用於實體服務等較低級別的服務可能涉及大量工作並且性能可怕。在這種情況下,您可能想知道RESTful服務是否真的是最佳選擇。