2013-07-08 3 views
7

हमारे डब्ल्यूएफ 4 वर्कफ़्लो सेवा में, हम यथासंभव मजबूत होने की कोशिश करते हैं। हम जो चीजें करते हैं उनमें से एक हैंडलरर और प्रोवाइडफॉल्ट (IErrorhandler) के अंदर त्रुटियों को लॉग करना है। प्रलेखन राज्यों स्पष्ट रूप से है कि HandleError प्रवेश करने के लिए सही जगह होगी, लेकिन मैं कुछ अजीब बातें होती हैं देखें:हैंडलरर बनाम वर्कफ़्लो सेवा में प्रोवाइडफॉल्ट असंगतता, कैसे संभालें?

  1. मैं कुछ त्रुटियां हैं जिन्हें केवल ProvideFault को गति प्रदान, लेकिन कभी HandleError, एक उदाहरण था देखें:

    सिस्टम.NullReferenceException: ऑब्जेक्ट संदर्भ किसी ऑब्जेक्ट के उदाहरण पर सेट नहीं है। System.ServiceModel.Activities.Dispatcher.DurableInstanceManager.GetInstanceAsyncResult.GetInstance() पर System.ServiceModel.Activities.Dispatcher.DurableInstanceManager.GetInstanceAsyncResult..ctor पर

  2. वहाँ भी कुछ त्रुटियां हैं जिन्हें केवल गति प्रदान HandleError , लेकिन ProvideFault कभी नहीं, एक उदाहरण था:

    सिस्टम.ServiceModel.CommunicationException: पाइप से पढ़ने में त्रुटि हुई: पाइप समाप्त हो गया है। (109, 0x6d)। System.ServiceModel.Channels.PipeConnection.Read पर (बाइट [] बफर, Int32 ऑफसेट, Int32 आकार, TimeSpan का समय समाप्त) System.ServiceModel.Channels.SessionConnectionReader.Receive पर (TimeSpan टाइमआउट)

  3. अंत में देखते हैं त्रुटियां जो दोनों, पहले ProvideFault और फिर हैंडलरर (पृष्ठभूमि थ्रेड पर)

  4. यदि संभव हो, तो मैं भी संबंधित आने वाले संदेश को लॉग करना चाहता हूं। मैं OperationContext.Current.RequestContext.RequestMessage.ToString() यह आमतौर पर केवल ProvideFault में काम करता है, HandleError में हम RequestContext किसी भी अधिक

तो मेरी निष्कर्ष था, सभी लॉग इन करने की जरूरत नहीं है के साथ ऐसा कर त्रुटियां, मुझे दोनों तरीकों से लॉग इन करना होगा। लेकिन इससे 3 डुप्लिकेट लॉग प्रविष्टियों की वजह होती है, 3 ..

मेरा वर्तमान कामकाज ProvideFault से अंतिम लॉग अपवाद को "याद रखना" था, और अगर यह अपवाद हैंडलरर में प्रवेश करता है तो इसे अनदेखा करें। मुझे बहुत साफ नहीं लगता है।

क्या कोई लॉग इन करने के लिए कोई बेहतर, विश्वसनीय तरीका है त्रुटियां जो डब्ल्यूएफ सेवा के अंदर हो सकती हैं?

और कृपया Logging exceptions in WCF with IErrorHandler inside HandleError or ProvideFault? पर इंगित न करें क्योंकि इससे कोई सहायता नहीं मिलती है।

उत्तर

0

मैंने देखा है परिदृश्य 2 एक अलग संदर्भ (BizTalk एडाप्टर) में होती हैं, और यह कि HandleError एक अपवाद है कि अनुकूलक में होता है, क्योंकि कहा जाता है लगता है, लेकिन ProvideFaultबुलाया नहीं कोई संदेश है, क्योंकि वहाँ के लिए वास्तव में है वापसी - गलती इस तरह से हुई कि यह एडाप्टर को वास्तव में संदेश को उत्पन्न/पढ़ने/अनुवाद करने और पाइपलाइन पर पास करने से रोकती है। यह उत्पन्न होने से गलती संदेश को रोकने के लिए प्रतीत होता है।एक पाइप से पढ़ने में विफल होने के कारण यह माना जाएगा - आपकी सेवा को यह नहीं पता कि यह असफल रहा है क्योंकि यह कभी भी कनेक्ट नहीं हुआ है या अगर यह विफल हुआ क्योंकि दूरस्थ सर्वर विफल हुआ। TransactionAbortedException जैसी चीजें भी इसका कारण बन सकती हैं, या (मेरे विशेष मामले में), SqlException इसका कारण बन सकती है।

यह मामले # 1 के लिए कुछ सुराग देना चाहिए, जिसे मैंने स्वयं नहीं देखा है या पुन: उत्पन्न किया है: यह मैसेजिंग श्रृंखला में कहीं भी अनुचित अपवाद हैंडलिंग के कारण है। इस मामले में, एक गलती संदेश उत्पन्न हुआ था, लेकिन श्रृंखला को ऊपर उठाने में कुछ अपवाद इस तरह से अपवाद को संभालने में विफल रहा कि HandleError कहा जा सकता है। एक NullReferenceException यहां समझ में आता है - अगर आप सही जांच को सही तरीके से संभाल नहीं पाते हैं तो यह कहना मुश्किल है कि इस तरह के मामले में लाइन के नीचे और क्या होगा।

जहां तक ​​यह हल हो रहा है, मैं संभवतः दोनों स्थानों पर लॉग इन करने का प्रयास करता हूं, कुछ अतिरिक्त जानकारी के साथ कि लॉग कहां से आया था। यह असफल होगा, भले ही यह डुप्लिकेट लॉगिंग करता हो। दूसरी तरफ, यदि आपके पास इनमें से एक या दोनों परिदृश्य उत्पन्न करने वाले अपवादों की एक सूची है, तो आप यह जांचने के लिए तर्क लागू कर सकते हैं कि यह किस प्रकार का अपवाद है (या यह कहां हुआ) - शायद यह अपवाद है कि कम लॉगिंग कर रहा है अन्य विधि द्वारा संभाला जा सकता है।

संबंधित मुद्दे