2009-08-13 13 views
7

मैं अपने सेवा में जगह में मानक त्रुटि सौंपने है:निम्न स्तर की डब्ल्यूसीएफ त्रुटियों को कैसे संभालें?

  • मैं एक IErrorHandler सेवा सेवा निष्पादन के दौरान अप्रत्याशित त्रुटियों को संभालने के लिए करने के लिए झुका दिया है।
  • अपेक्षित मामलों को संभालने के लिए मैंने अपनी सभी सेवा विधियों में ब्लॉक को आजमाया/पकड़ लिया है।

हालांकि, ऐसे मामले हैं जहां सर्वर पर अपवाद फेंक दिए जाते हैं और न ही उन्हें बुलाया जाता है।

  • सर्वर 5 सेकंड के लिए बाध्य पर receiveTimout सेट करें:

    यहाँ एक मामले में जहां सर्वर अपवाद IErrorHandler को नहीं भेजी जाती है।

:

  • ग्राहक पर यह करते हैं।

    Service1Client sc = new Service1Client(); 
    ICommunicationObject o = sc as ICommunicationObject; 
    
    o.Open(); // open channel 
    
    sc.GetData(10); // do a first call 
    
    Thread.Sleep(10000); // wait longer than the server receiveTimeout 
    
    sc.GetData(10); // Attempt another call: server throws a FaulException 
    

    उस स्थिति में, सर्वर पर त्रुटि फेंक दी गई है लेकिन मुझे इसे संभालने का तरीका नहीं मिल रहा है (और इसे लॉग करें)। मुझे पता है कि एक त्रुटि उठाई गई है क्योंकि अगर मैं सर्वर प्रक्रिया पर एक डीबगर संलग्न करता हूं और सभी अपवादों को तोड़ता हूं, तो डीबगर टूट जाता है।

    मुझे अन्य समान मामले मिल गए हैं जहां मेरे कार्यक्रम में निम्न स्तर की त्रुटियां पास नहीं की गई हैं।

    मैं यह सुनिश्चित करने के लिए अपने कोड को कहां लगा सकता हूं कि मैं क्लाइंट ऐप पर वापस आने से पहले सर्वर पर होने वाले सभी अपवादों को संभाल सकता हूं? क्या मुझे अपना खुद का आईसीएचनल या कुछ अन्य निम्न स्तर इंटरफ़ेस लागू करना चाहिए?

    धन्यवाद

    अद्यतन सितं, 21 2009: पर Microsoft WCF फोरम this धागा देखें। अगर मैं इस प्रकार के अपवाद को संभालना चाहता हूं तो मुझे शायद अपने चैनल को लागू करना होगा। जब मैं अधिक जानकारी प्राप्त करता हूं तो मैं इस पोस्ट को फिर से अपडेट करूंगा।

  • +0

    प्राप्तटाइम सर्वर बाध्यकारी यहां खेलना नहीं चाहिए - यह केवल तभी होगा जब कॉल से GetData() पर प्रतिक्रिया प्राप्त करने में 5 सेकंड से अधिक समय लगे। आपका ग्राहक 10 सेकंड के लिए सो रहा है इसका कोई प्रभाव नहीं पड़ता है। प्रारंभिक परीक्षण सेवा मानते हुए और 5 सेकंड तक प्राप्त करने के लिए सर्वर बाध्यकारी अद्यतन करना समस्या को पुन: उत्पन्न नहीं करता है। ग्राहक पर आपकी गलती क्या है? मुझे वास्तव में एक गलत कॉन्फ़िगर सर्वर बाध्यकारी/व्यवहार पर संदेह होगा, खासकर यदि आप अपने कोड में सेवा में नहीं तोड़ रहे हैं। क्लाइंट/सेवा पर डब्ल्यूसीएफ डीबगिंग सक्षम करें और देखें कि यह क्या दिखाता है। –

    +0

    जैसा कि एमएसडीएन में वर्णित है, सर्वर प्राप्त होता है टाइमआउट अधिकतम समय होता है जब सर्वर निष्क्रिय निष्क्रिय चैनल की प्रतीक्षा करेगा। उस स्थिति में समय की मात्रा पार हो गई है। क्लाइंट पर अपवाद एक संदेश सुरक्षा सुरक्षा है जिसमें एक आंतरिक FautException है। आंतरिक FaultException का कहना है कि प्राप्त टाइमआउट समाप्त हो गया है। – Sylvain

    +0

    दिलचस्प। मुझे लगता है कि यह भी एक संकेत हो सकता है कि यह पहली कॉल पर क्यों काम करता था, दूसरा नहीं। क्या आप प्राप्त करने के लिए संदर्भित दस्तावेज़ के लिए एक लिंक अग्रेषित कर सकते हैं? मुझे डर है कि इस मूल्य की मेरी समझ त्रुटिपूर्ण है। जिन दस्तावेज़ों का मैं उल्लेख करता हूं वे http://msdn.microsoft.com/en-us/library/ms731299 हैं।एएसपीएक्स, धन्यवाद! –

    उत्तर

    5

    की एक बड़ी संख्या है, तो यह उपयोगी हो सकता है, जवाब है:

    इस समय (.NET 3.5) कोई तंत्र नहीं है जो किसी को डब्ल्यूसीएफ कॉल के संदर्भ में होने वाले सभी संभावित अपवादों को संभालने की अनुमति देता है।

    1. सभी सेवा के तरीकों की उम्मीद मामलों को संभालने के लिए में ट्राई/कैच ब्लॉक:

      अपवाद है कि सेवा विधि निष्पादन के दौरान हो आसानी से संभाला जा सकता।

    2. आईररहैंडलर सेवा निष्पादन के दौरान अप्रत्याशित त्रुटियों को संभालने के लिए सेवाओं से जुड़ा हुआ है।

    हालांकि, निम्न स्तर की डब्ल्यूसीएफ आधारभूत संरचना त्रुटियों के लिए, कोई सही समाधान नहीं है। ऐसा लगता है कि सबसे अच्छा समाधान अधिक अपवादों को पकड़ने के लिए एक कस्टम चैनल को लागू करना प्रतीत होता है।

    this Microsoft Connect Bug Report में, माइक्रोसॉफ्ट पुष्टि करता है कि सभी प्रकार के डब्ल्यूसीएफ आधारभूत संरचना त्रुटियों को संभालने का कोई तरीका नहीं है।

    this thread on the Microsoft WCF forums में, एक कस्टम चैनल को कार्यान्वित करने के तरीके पर एक नमूना है। वह समाधान केवल HTTP के लिए काम करता है, न कि HTTPS के लिए। इसके अलावा कुछ डब्ल्यूसीएफ आधारभूत संरचना त्रुटियों को कस्टम चैनल द्वारा पकड़ा नहीं जाता है (उस विशिष्ट थ्रेड में अधिक जानकारी देखें)।

    +0

    @ अनामित मतदाता: मैं वास्तव में जानना चाहता हूं कि डाउन वोट क्यों। यह सही जवाब है। यदि आप एक बेहतर उत्तर जानते हैं तो कृपया इसे पोस्ट करें। – Sylvain

    0

    बिंदु यह है - यदि सर्वर पहुंच योग्य नहीं है या संदेश को संभाल नहीं सकता है, तो सर्वर पर कोई त्रुटि नहीं होगी - त्रुटि क्लाइंट ("टाइमआउट अपवाद" या अन्य) पर पॉप अप हो जाएगी।

    तो उन मामलों में, सर्वर पर आईररहैंडलर वास्तव में मदद नहीं करेगा - चूंकि त्रुटि वास्तव में क्लाइंट पर होती है (नेटवर्क के कारण कोई कनेक्शन नहीं बनाया जा सकता है, या सर्वर के पते में टाइपो या एसएसटीएफ जैसे उस)।

    तो ग्राहक पक्ष पर, आपको निश्चित रूप से भी प्रयास करना होगा .... अपने सभी सर्वर कॉल के आसपास पकड़ें।

    मार्क

    +2

    सही नहीं है। यह वह सर्वर है जो कॉल को संभालने से इंकार कर देता है क्योंकि प्राप्त टाइमआउट समाप्त हो गया है। इसलिए सर्वर द्वारा अपवाद उठाया जाता है। जैसा कि मैंने लिखा है, मैं सर्वर प्रक्रिया पर डीबगर संलग्न कर सकता हूं और फिर मुझे अपवाद उठाया जा रहा है; समस्या यह है कि यह ग्राहक को वापस आने से पहले एक हैंडलर को पास नहीं किया जाता है। मुझे सर्वर पर इस अपवाद को संभालने का एक तरीका चाहिए। – Sylvain

    +0

    ठीक है, आप getTImeout के लिए सही हैं - लेकिन अन्य त्रुटियां (esp। संचार त्रुटियां) हो सकती हैं क्योंकि क्लाइंट कनेक्ट करने का प्रयास कर रहा है, और सर्वर तक कभी नहीं पहुंच पाएगा, और इन मामलों में, सर्वर पर IErrorHandler स्पष्ट रूप से वास्तव में कोई उपयोग नहीं है। –

    +0

    यह सही है; कुछ मामलों में (सर्वर उदाहरण के लिए नीचे है), त्रुटि केवल क्लाइंट पर ही होगी। लेकिन उन मामलों के लिए जहां यह सर्वर पर होता है, मुझे यह सुनिश्चित करना होगा कि मैं उन सभी को संभालूं। – Sylvain

    0

    नैदानिक ​​ट्रेसिंग सेट करें और Service Trace Viewer Tool साथ लॉग की जाँच करें। लिंक में ट्रेसिंग को कॉन्फ़िगर करने के बारे में जानकारी भी शामिल है।

    +1

    मैंने किया; मुझे ट्रेस में सर्वर पर त्रुटि दिखाई देती है। मैं इन मामलों को "ट्रेस" नहीं करना चाहता, मैं उन्हें "संभाल" देना चाहता हूं। – Sylvain

    +0

    ट्रेसिंग यह समझने में मदद करेगी कि अपवाद कहां और क्यों हो रहा है, मुझे लगता है कि उसका मतलब है (क्लाइंट और सेवा दोनों का पता लगाएं)। ऑपरेशन स्तर पर अपवादों को सही ढंग से संभालना (कोशिश/पकड़/फॉल्टेक्सप्शन फेंकना) और एक आईरर हैंडलर को आपके आधार (कम से कम मैंने सोचा) को कवर करना चाहिए। जहां यह गिर सकता है आईरर हैंडलर कार्यान्वयन या सेवा कॉन्फ़िगरेशन में कोई समस्या है, इसलिए अपवाद हैंडलिंग में स्वयं एक त्रुटि है और समस्या की सटीक रिपोर्ट नहीं करता है। निश्चित रूप से यह जानने में दिलचस्पी है कि क्या यह सभी अड्डों को कवर नहीं करता है! –

    +0

    आप इस अपवाद को "संभाल" कैसे करेंगे? –

    2

    फाल्टकंट्रैक्ट्स का उपयोग करें। फिर ग्राहक अंत में गलती को संभाला जा सकता है।

    http://msdn.microsoft.com/en-us/library/ms732013.aspx

    http://www.c-sharpcorner.com/UploadFile/ankithakur/ExceptionHandlingWCF12282007072617AM/ExceptionHandlingWCF.aspx

    यह भी ज्यादा डिबगिंग के लिए बेहतर है, अक्सर जब से तुम एक ग्राहक को विकसित किया जाएगा और डीबगिंग उद्देश्यों के लिए सर्वर नीचे लाने के लिए नहीं करना चाहती।

    ग्राहक अंत में, सभी अपवाद/दोषों को पकड़ने के लिए प्रयास/पकड़ ब्लॉक का उपयोग करें। निश्चित रूप से ऐसी त्रुटियां हैं जिन्हें सर्वर अंत में पता नहीं लगाया जा सकता है, जैसे संचार समस्या, इसलिए आपको क्लाइंट एंड पर त्रुटियों को संभालने की आवश्यकता है।

    यदि आप केंद्रीकृत त्रुटि प्रबंधन चाहते हैं, तो आप एक ऐसी सेवा बना सकते हैं जो सभी त्रुटियों के बारे में संदेश लेती है, उस सर्वर को त्रुटि भेजें, और इसे लॉग करें। आप एक केंद्रीकृत संदेश अनुरेखण/प्रदर्शन विश्लेषण/लॉगिंग उपकरण बनाना चाहते हैं और अधिक अनुसंधान और प्रयोग के बाद आवेदन प्रोसेसर, सर्वर, ग्राहकों आदि

    +1

    मैं फॉल्टकंट्रैक्ट्स का भी उपयोग करता हूं। लेकिन इस विशिष्ट मामले में, ऑपरेशन निष्पादन से पहले त्रुटि होती है। इसलिए मुझे अपवाद को FaultException में बदलने का मौका भी नहीं है। – Sylvain

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