WCF मूल HttpBinding: रोलबैक जब क्लाइंट को उत्तर विफल रहता है



transactions basichttpbinding (1)

मैं एक basicHttpBinding माध्यम से एक WCF सेवा को उजागर कर रहा हूँ जो कि डेटाबेस पर कई कार्रवाइयां निष्पादित करता है

मैं गारंटी देना चाहता हूं कि अगर ग्राहक को जवाब नहीं मिलता है तो डाटाबेस परिचालनों को वापस लाया जाता है ( डब्लूसीएफ के माध्यम से कोई भी लेनदेन प्रवाह नहीं )। उदाहरण के लिए क्लाइंट "डॉक्स" विधि को कॉल करता है जो सर्वर पर निष्पादित करता है लेकिन क्लाइंट क्रैश समाप्त होने से पहले। डेटाबेस ऑपरेशन को फिर से शुरू किया जाना चाहिए जैसे ही जवाब ग्राहक को नहीं भेजा जा सकता है।

क्या उसे करने का कोई तरीका है? क्या [OperationBehavior(TransactionScopeRequired=true)] इस तरह के तरीके से काम करता है? क्या सर्वर की ओर से संचार त्रुटियों को संभालने की कोई संभावना है?

अपडेट 1: ऐसा लगता है कि [OperationBehavior(TransactionScopeRequired=true)] ग्राहक को जवाब भेजने से पहले लेन-देन करता है और इस तरह क्लाइंट को जवाब नहीं मिलने पर रोलबैक करने के लिए उपयोग नहीं किया जा सकता।

अपडेट 2: इसे स्पष्ट रूप से दोबारा बताएं, मुझे ग्राहक पक्ष के साथ किसी भी तरह से बातचीत करने के लिए लेनदेन की आवश्यकता नहीं है। क्लाइंट को लेनदेन के बारे में न तो पता होना चाहिए, इसे रद्द करने या प्रतिबद्ध करने की क्षमता है, न ही बाध्यकारी माध्यम से कोई भी लेनदेन प्रवाह होना चाहिए। एकमात्र स्थान मैं चाहता हूं कि लेन-देन को रोलबैक सर्वर साइड पर है यदि ट्रांसपोर्ट चैनल प्राप्त ग्राहक को संदेश नहीं दे सकता है। टीसीपी / आईपी के मामले में यह जानकारी सर्वर पर आसानी से उपलब्ध होनी चाहिए। (टीसीपी पैकेट का एसीके ग्राहक को वापस नहीं भेजता है)

तो सर्वर साइड पर एक काल्पनिक निष्पादन प्रवाह (क्लाइंट साइड की कमी को नोटिस) होना चाहिए:

Receive client request

Start transaction

Execute all logic inside the service operation

Send reply back to client

if (reply.failedToReceive) { transaction.Rollback() } // due to a failing TCP/IP transmission

इस सवाल का कोई आसान जवाब नहीं है आप ऐसे व्यवहार के लिए पूछ रहे हैं जो WS- * में लागू किया गया है लेकिन मूल सोप का उपयोग करके किया गया है मुझे लगता है कि आपका एकमात्र विकल्प है यदि आप वास्तव में wsHttpBinding को स्विच नहीं कर सकते हैं या @ ट्रैवर पिल्ले द्वारा सुझाए गए द्वैध का उपयोग कर सकते हैं, मूल सोप पर आधारित अपने स्वयं के कस्टम प्रोटोकॉल में डब्ल्यूएस-लेनदेन के व्यवहार की नकल करने की कोशिश करना है।

आपको पूर्ण WS- लेनदेन विनिर्देशन पर कुछ सरलता प्राप्त करने में सक्षम होना चाहिए क्योंकि

  • संभवतः आपको केवल एक सेवा पर लेनदेन का समर्थन करने की आवश्यकता होगी - आप कई स्वतंत्र सेवाओं पर एक वितरित लेनदेन नहीं करेंगे
  • आपको दोनों लघु लेनदेन ( डब्लूएस-एटॉमिक ट्रान्ससेक्शन ) के साथ-साथ लंबे समय से चलने वाले लेनदेन ( डब्लूएस-बिज़नेस एक्टिविटी ) प्रोबाबाई परमाणु लेनदेन का समर्थन करने की आवश्यकता नहीं होगी
  • आपको किसी भी प्रकार के एक्सटेंसिबिलिटी मॉडल ( डब्ल्यूएस-कोऑर्डिनेशन ) को समर्थन देने की आवश्यकता नहीं होगी
  • आपको एक खोज / मेटाडेटा मॉडल को लागू करने की आवश्यकता नहीं होगी जो प्रोटोकॉल का वर्णन करता है (जैसे डब्लूएसडीएल जैसे) क्योंकि आप प्रोटोकॉल व्यवहार सीधे ग्राहक और सेवा में कोडिंग करेंगे।

हालांकि, संभवतः आपको डब्लूएस-कोऑर्डिनेशन और डब्लूएस-एटॉमिक ट्रांजेक्शन दोनों के तत्वों की आवश्यकता होगी। यह किसी भी तरह से एक सरल काम नहीं है और यह कुछ सूक्ष्म को याद करना आसान होगा जो आपके रोल के चलने के लिए या (बस के रूप में बुरे) यानी आपकी सेवा के प्रदर्शन को नष्ट करने के कारण लंबे समय तक आपके सभी डाटाबेस को लॉक करके लॉक कर सकता है दुर्घटनाग्रस्त ग्राहक

जैसे मैं कहता हूं, यह एक जटिल व्यवहार है और यदि आप तैयार किए गए, मानकीकृत प्रोटोकॉल का उपयोग नहीं कर सकते हैं, तो कोई आसान जवाब नहीं है।





basichttpbinding