2012-01-17 11 views
5

मेरे पास एएसपी.नेट वेब सेवा है (डब्ल्यूसीएफ नहीं बल्कि क्लासिक .asmx वेबमाइड्स के साथ) जो अपवाद फेंकता है। अपवाद सभी दो आधार अपवाद वर्गों (जो दोनों के अपवाद से निकाले जाते हैं) में से एक से निकाले जाते हैं:मैं एएसपीनेट वेब सेवा द्वारा फेंकने वाले अपवाद के प्रकार को कैसे निर्धारित कर सकता हूं?

public class InputException : Exception 
{ 
    .... 
} 

public class FatalException : Exception 
{ 
    .... 
} 

public class NoFilesFound: FatalException 
{ 
    .... 
} 

.... 

वेब सेवा अभी अपवाद के रूप में की जरूरत फेंकता है। (के रूप में देखा है जब मैं .GetType() पकड़ा अपवाद पर करते हैं)

Server was unable to process request. ---> There were no files found

हालांकि अपवाद प्रकार FaultException की है: मेरे मुवक्किल कोड में मैं अपवाद पकड़ कर सकते हैं और इस तरह से संदेश दिखाई। कॉलिंग क्लाइंट को इनपुट इनपुट और फ़ैटलएक्सप्शन के बीच अंतर करने में सक्षम होना चाहिए (और व्यक्तिगत व्युत्पन्न लोगों के बीच बेहतर रूप से भिन्न होना चाहिए लेकिन यह उतना महत्वपूर्ण नहीं है)। अभी ऐसा करने का एकमात्र तरीका संदेश को पार्स करना है, टेक्स्ट को "--->" से पहले पट्टी करें और टेक्स्ट पर स्विच करें। यह स्पष्ट रूप से इष्टतम नहीं है।

मुझे पता है कि मैं कस्टम कोड के साथ साबुन अपवाद फेंक सकता हूं लेकिन यदि संभव हो तो मैं इससे बचना चाहता हूं। इसके अलावा यह उन लोगों के लिए डिज़ाइन किया गया है जो एक्सएमएल से निपटते हैं लेकिन हमारे सभी webservice कोड XML को स्पर्श नहीं करते हैं क्योंकि यह हमारे लिए पहले से ही deserialized है।

तो संक्षेप में, क्या मेरे लिए webservice से कस्टम अपवाद फेंकने और कॉल करने वाले क्लाइंट के अपवादों के बीच अंतर करने में सक्षम होने का कोई तरीका है?

उत्तर

7

इसे संभालने का उचित तरीका SoapException का उपयोग करना है। तो आप मूल रूप से सेवा पर सभी संभावित अपवादों को पकड़ लेंगे और फिर उन्हें एक साबुन अपवाद (मेरे द्वारा लिंक किए गए दस्तावेज में एक उदाहरण शामिल है) में अनुवाद करें और फिर अपने कुछ अपवाद को फेंकने के बजाय इस सोपएक्सप्शन को फेंक दें और उस जानकारी को शामिल करें जिसमें आप रुचि रखते हैं गलती का विस्तार एक्सएमएल नोड।

फिर क्लाइंट पर सेवा का आह्वान करते समय आप इस सोपएक्सप्शन को पकड़ने और सर्वर पर होने वाली गलती के सही कारण के बारे में अधिक जानकारी एकत्र करने के लिए विस्तारित XML नोड का विश्लेषण करने में सक्षम होंगे।

डब्ल्यूसीएफ में यह सभी मैनुअल पीढ़ी की गलती नोड्स को बहुत आसान प्रदान किया गया है, जहां आप बस डेटा अनुबंधों के साथ काम करते हैं और FaultException<SomeFaultContract> पकड़ते हैं।

चलो एक उदाहरण लें। मान लीजिए आप निम्नलिखित सेवा विधि है जो एक SoapException फेंकता है और विवरण नोड में त्रुटि के बारे में विवरण प्रदान करता है:

[WebMethod] 
public string HelloWorld() 
{ 
    var doc = new XmlDocument(); 
    var node = doc.CreateNode(
     XmlNodeType.Element, 
     SoapException.DetailElementName.Name, 
     SoapException.DetailElementName.Namespace 
    ); 
    // you could actually use any sub nodes here 
    // and pass even complex objects 
    node.InnerText = "no files found"; 

    throw new SoapException(
     "Fault occurred", 
     SoapException.ClientFaultCode, 
     Context.Request.Url.AbsoluteUri, 
     node 
    ); 
} 

जब यह उपभोक्ता आप क्लाइंट पर इस SoapException के लिए पकड़ सकते थे:

using (var client = new WebService1()) 
{ 
    try 
    { 
     var result = client.HelloWorld(); 
    } 
    catch (SoapException ex) 
    { 
     var detail = ex.Detail; 
     // detail.InnerText will contain the detail message 
     // as detail is an XmlNode if on the server you have 
     // provided a complex XML you would be able to fetch it here 
    } 
} 

के रूप में जहां तक ​​आपके InputException, FatalException और NoFilesFound अपवादों का संबंध है, वे ठीक हैं, लेकिन उन्हें सर्वर पर रहना चाहिए। उन्हें अपनी वेब विधि में पकड़ें और एक उचित SoapException बनाएं जो ग्राहक सेवा लेने के दौरान समझने में सक्षम होंगे।

+0

धन्यवाद! मुझे आश्चर्य होगा कि क्या मैं अपने कस्टम वर्गों को सोपएक्सप्शन से प्राप्त कर सकता हूं और फिर XmlNodes बनाने के लिए कन्स्ट्रक्टर का उपयोग कर सकता हूं ... – user1079591

+0

@ user1079591, हाँ, आप कर सकते हैं और यह वास्तव में आगे बढ़ने का एक बहुत अच्छा तरीका है। –

+0

इसलिए मैंने सुझाव दिया जैसा कि आपने सुझाव दिया था लेकिन क्लाइंट कोड में यह इसे साबुन अपवाद के रूप में नहीं पकड़ रहा है बल्कि एक सिस्टम के रूप में है। ServiceModel.FaultException। मेरे कोड में मेरे पास दो कैच ब्लॉक हैं: एक सोपएक्सप्शन के लिए और एक नियमित अपवाद के लिए और यह हमेशा नियमित अपवाद पर जाता है और जब मैं करता हूं।जेनेरिक पर) GetType() यह कहता है कि यह System.ServiceModel.FaultException प्रकार है। – user1079591

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