2010-12-16 13 views
8

मेरे पास बहुत सी विरासत कोड है जो अब डब्लूसीएफ आरईएसटी सेवा के लिए बैकएंड है - अगर यह मायने रखता है, तो यह सामान्य डब्लूसीएफ सेवा बैकएंड होता था। मैं एक ऐसी तंत्र को कार्यान्वित करना चाहता हूं जो किसी भी विधि में किसी भी अपवाद को पकड़ ले और इसका विश्लेषण करे। यदि यह एक ज्ञात त्रुटि साबित होता है, तो इसे संसाधित किया जाएगा और एक दोस्ताना दिखने वाली गलती में बदल दिया जाएगा।डब्ल्यूसीएफ आरईएसटी सेवाएं - जेनेरिक अपवाद हैंडलिंग

मुझे पता है कि मैं 'सामान्य' अपवादों के बजाय FaultException या WebProtocolException फेंक सकता हूं, लेकिन ऐसे कई स्थान हैं जहां सभी कोड अपवादों को फेंक दिया जाता है, और उन सभी को ढूंढना काफी दर्दनाक विकल्प है।

मैंने एक एंडपॉइंट व्यवहार एक्सटेंशन जोड़ने की कोशिश की जो एक नया व्यवहार बनाता है जो मानक WebHttpBehavior.AddServerErrorHandlers विधि को ओवरराइड करता है और एंड्रॉइड प्रेषक त्रुटि हैंडलर संग्रह में मेरे त्रुटि हैंडलर (IErrorHandler कार्यान्वयन) जोड़ता है। त्रुटि हैंडलरों के अंदर मैं अपवाद का विश्लेषण करता हूं और इस अपवाद पर वांछित गलती बेसिंग (या नहीं बना) बनाता हूं।

मुझे उम्मीद है कि इस तंत्र को किसी भी ज्ञात अपवाद के लिए कस्टम डेटा वापस करने की उम्मीद है, लेकिन मैं गलत था। अच्छे पुराने माइक्रोसॉफ्ट एक अद्भुत अपरिहार्य WebHttpBehavior2 है, जो बिना शर्त endpoint डिस्पैचर त्रुटि संचालकों संग्रह के अंत में एक आंतरिक Microsoft.ServiceModel.Web.WebErrorHandler कहते हैं लागू किया गया है। यह हैंडलर पहले से निष्पादित हैंडलर को अनदेखा करता है और अपवादों का केवल एक छोटा सेट पहचानता है, जबकि बहुमत को "आंतरिक सर्वर त्रुटि" के रूप में व्याख्या किया जाता है, और कुछ भी नहीं।

सवाल यह है कि क्या मैं सही रास्ते पर हूं और डब्ल्यूसीएफ आरईएसटी तंत्र में इस हैंडलर को अक्षम करने का एक तरीका है, या इसे एक नए अपवाद के साथ पेश करें (उदाहरण के लिए, जब कोई अपवाद पकड़ा जाता है, तो यह पहली बार मेरे द्वारा संसाधित किया जाता है संचालकों और अगर वे,/वापसी फेंक उदाहरण के लिए, FaultException, तो यह नया अपवाद मूल एक के बजाय Microsoft.ServiceModel.Web.WebErrorHandler) के लिए आपूर्ति की है। यदि IErrorHandler और व्यवहार एक्सटेंशन के साथ मेरे सभी प्रयोग बेकार हैं, तो वैकल्पिक क्या है? दोबारा, मैं वास्तव में अपवाद फेंकने तर्क को संशोधित नहीं करना चाहता, मैं चाहता हूं कि एक स्थान अपवादों को पकड़ने और उन्हें संसाधित करने के लिए।

बहुत बहुत धन्यवाद!

उत्तर

7

जब आप आराम करने के लिए WCF सोप सेवाओं में बदलाव, त्रुटि की सूचना और हैंडलिंग परिवर्तन की पूरी मानसिकता।

SOAP में, दोष आपके अनुबंध का हिस्सा हैं। आरईएसटी में, वे बस कोड बन जाते हैं जिन्हें आप HTTP प्रतिक्रिया कोड और विवरण में आउटपुट करते हैं।

catch (Exception e) 
{ 
    Trace.WriteLine(e.ToString()); 

    OutgoingWebResponseContext response = WebOperationContext.Current.OutgoingResponse; 
    response.StatusCode = System.Net.HttpStatusCode.UnsupportedMediaType; // or anything you want 
    response.StatusDescription = e.Message; 
    return null; // I was returning a class 
} 

तो मैं आप जो आपके लिए प्रासंगिक त्रुटि कोड बनाता है और जवाब में डाल एक सहायक कोड बनाने का सुझाव देते हैं:

यहाँ एक पकड़ने का टुकड़ा है।

+0

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

+0

'स्थिति डिस्क्रिप्शन' को सेट करने से कोई प्रभाव नहीं पड़ता है! प्रतिक्रिया हमेशा सामान्य स्थिति विवरण है। इसे ठीक करने का कोई तरीका है? – Hemant

+0

इसमें है।आप इसे फिडलर का उपयोग कर सर्वर से आउटगोइंग संदेश में देख सकते हैं .... लेकिन जो आपको लगता है वह यह है कि विभिन्न ब्राउज़रों या विभिन्न कार्यान्वयन विवरण को अनदेखा कर सकते हैं और कोड को पूर्वनिर्धारित संदेश पर मैप करने के लिए उपयोग कर सकते हैं। मेरे पास एक एंड्रॉइड ऐप था जो मैं कर रहा था और मैं विवरण सेट अप करने के साथ-साथ विधि हस्ताक्षर को बदलना समाप्त कर दिया ताकि मैं एक स्ट्रिंग वापस कर सकूं। ओह! ** यही कारण है कि मैं कभी भी डब्लूसीएफ आरईएसटी का कभी भी उपयोग नहीं करूंगा। ** – Aliostad

2

यह मैं पिछले

में क्या किया
public class MyServerBehavior : IServiceBehavior { 

     public void AddBindingParameters(ServiceDescription serviceDescription, 
      ServiceHostBase serviceHostBase, 
      Collection<ServiceEndpoint> endpoints, 
      BindingParameterCollection bindingParameters) { 

     } 

     public void ApplyDispatchBehavior(ServiceDescription serviceDescription, 
              ServiceHostBase serviceHostBase) { 

      foreach (ChannelDispatcher chDisp in serviceHostBase.ChannelDispatchers) { 
       chDisp.IncludeExceptionDetailInFaults = true; 
       if (chDisp.ErrorHandlers.Count > 0) { 
        // Remove the System.ServiceModel.Web errorHandler 
        chDisp.ErrorHandlers.Remove(chDisp.ErrorHandlers[0]); 
       } 
       // Add new custom error handler 
       chDisp.ErrorHandlers.Add(new MyErrorHandler()); 

      } 

     } 

     public void Validate(ServiceDescription serviceDescription, 
          ServiceHostBase serviceHostBase) { 
     } 

    } 

MyErrorHandler मेरी कक्षा कि IErrorHandler लागू किया गया था।

+0

यह मेरे जैसा ही दिखता है। क्या यह आरईएसटी सेवा के लिए काम करता है, या सिर्फ एसओएपी के लिए? अगर यह आरईएसटी सेवा के लिए काम करता है, तो आपने सेवा को कैसे कॉन्फ़िगर किया? अगर सिर्फ एसओएपी के लिए, तो धन्यवाद, लेकिन आरईएसटी एक पूरी तरह से अलग कहानी है, जहां तक ​​मैं इसे अब देखता हूं। –

+1

@ माइकल मैंने इसे आरईएसटी सेवाओं के लिए किया था। मैं स्वयं-होस्ट किया गया था और वास्तव में अपना स्वयं का व्युत्पन्न सेवा होस्ट बनाया जिसने व्यवहार स्थापित किया। यह सभी कोड आधारित है, कोई एक्सएमएल नहीं है। –

+0

स्व-होस्टेड, मैं देखता हूं ... यही वह है जो मैं सोच रहा था लेकिन बहुत जटिल माना जाता था। धन्यवाद! –

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