RESTWCFサービスを利用しています。このRESTサービスの保存操作をトランザクションで実行する必要があります。Transactionオブジェクトをネットワーク経由でRESTWCFサービスに渡す方法はありますか?
4 に答える
これは、RESTという用語を発明したRoyFieldingからの引用です。
分散トランザクションプロトコルが必要な場合、アーキテクチャがRESTに基づいているとどのように言えるでしょうか。ある状況(クライアントとハイパーメディアでRESTfulアプリケーションの状態を使用してすべての状態遷移を決定する)から、クライアントがサーバーに管理方法を指示する必要があるトランザクションセマンティクスの分散合意が必要な次の状況にどのように移行できるかがわかりません。独自のリソース。
...今のところ、私は「残りの取引」を撞着語だと考えています。
これは、2009年6月9日のRESTディスカッションリストのメッセージからのものです。
ダレルの回答で引用されているロイ・フィールディングにほぼ同意します。RESTfulWebサービスを介してデータベーストランザクションのようなアプリケーション配管を公開しないでください。ただし、より機能的な方法で分散トランザクションにアプローチすることもできます。
購入用のギフト券を収集できるPOSシステムを実装しているとします。顧客は、ギフト券とクレジットカードによる支払いを組み合わせることができるはずです。ギフト券とクレジットカードによる支払いはどちらも、POSの外部のシステムによって処理されます。ギフト券の収集とクレジットカードでの支払いは、原子的な取引である必要があります。簡単にするために、1つのケースに焦点を当てましょう。顧客は最初にギフト券を受け取り、残りの金額をクレジットカードで支払います。クレジットカードでの支払いが失敗する可能性があるため、その場合はギフト券のコレクションもロールバックする必要があります。
ギフト券サービスは、コレクションを開始するためのURLを公開します。
/gift-voucher/{gift-voucher-id}/collection
このURLをリクエストすると、ギフト券の予約が作成され、保持されます。応答には、予約へのURLが含まれています。
/gift-voucher/{gift-voucher-id}/collection/reservation/${reservation-id}
このURLは、ギフト券コレクションをそれぞれ実行またはキャンセルするために、POSTまたはDELETEすることができます。
このアプローチは、トランザクションをロールバックするための機能的なユースケースがある(つまり、クレジットカードによる支払いの失敗)アプリケーションサービスに対してのみ正当化できることに注意してください。エンティティサービスなどの低レベルのサービスにこれを適用しようとすると、多くの作業が必要になり、パフォーマンスが低下する可能性があります。この場合、RESTfulサービスが本当に最良の選択であるかどうか疑問に思うかもしれません。
WCFでのトランザクションサポートは、多くのWS- *標準の1つによって処理され、それらはSOAPにのみ適用されます-webHttpBindingがトランザクション自体をサポートすることは非常に疑わしいです。
ただし、WCFRESTの上のレイヤーであるADO.NETDataservicesにチェックインすることをお勧めします。
これについては、ADO.NETDataServicesチームによるブログ投稿を参照してください。
マーク
このトピックに関する最近の議論は次のとおりです。http://social.msdn.microsoft.com/Forums/en-US/adodotnetdataservices/thread/e66651c0-9202-4049-a8f4-55971b8b359d
基本的には、次のように述べています。単一のPOST / PUT / DELETE要求には、1つのエンティティとCUD操作のみが関与するため、単一の要求はトランザクションをサポートせず、それらをサポートする意味がありません。ただし、トランザクションは次の方法でサーバー側に実装できます。
- バッチ要求の使用(クライアントからサーバーに1つのステップで送信されるPOST / PUT / DELETE要求のバンドル全体)
- 処理パイプラインを活用する(Processingイベントでトランザクションを開始し、 Processedイベントでトランザクションをコミット/ロールバックする)