2009-12-16 9 views
8

मैं .NET सेवा मॉडल का उपयोग कर एक सी # वेब सेवा कॉल कर रहा हूं और कभी-कभी यह वेब सेवा Microsoft.SharePoint.SoapServer.SoapServerException को फेंकता है। मैं अपने क्लाइंट कोड में FaultException के रूप में इस विशेष अपवाद को पकड़ सकता हूं हालांकि मुझे FaultException का उपयोग करके वेब सेवा द्वारा लौटाए गए दोस्ताना त्रुटि संदेश नहीं मिल सकता है।वेब सेवा में FaultException को पकड़ना

अपवाद होने पर वेब सेवा के लिए नेटवर्क ट्रेस निम्नलिखित है।

<?xml version="1.0" encoding="utf-8"?> 
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <soap:Body> 
     <soap:Fault> 
      <faultcode>soap:Server</faultcode> 
      <faultstring>Exception of type 'Microsoft.SharePoint.SoapServer.SoapServerException' was thrown.</faultstring> 
      <detail> 
       <errorstring xmlns="http://schemas.microsoft.com/sharepoint/soap/">Access to this Web site has been blocked. 
    Please contact the administrator to resolve this problem.</errorstring> 
       <errorcode xmlns="http://schemas.microsoft.com/sharepoint/soap/">0x81020071</errorcode> 
      </detail> 
     </soap:Fault> 
    </soap:Body> 
</soap:Envelope> 

मुझे उपर्युक्त प्रतिक्रिया में त्रुटिस्ट्रिंग नोड के बीच सामग्री प्राप्त करने में बहुत दिलचस्पी है। हालांकि FaultException वर्ग से मैं उपर्युक्त त्रुटि संदेश पुनर्प्राप्त नहीं कर सकता। क्या इसका मतलब है कि .NET ढांचा उपर्युक्त प्रतिक्रिया को सही ढंग से निराश नहीं करता है या मैं यहां गलत अपवाद वर्ग का उपयोग कर रहा हूं।

फॉल्टएक्सप्शन से प्राप्त एकमात्र त्रुटि संदेश "प्रकार का अपवाद" माइक्रोसॉफ्ट.शेयरपॉइंट.ओपसेसर। सोपसेवर एक्सेप्शन 'फेंक दिया गया था "और कुछ नहीं।

कृपया ध्यान दें कि मेरे पास वेब सेवा पर कोई नियंत्रण नहीं है।

उत्तर

24

इस मैं एक समाधान खोजने के लिए कर रहा था पर कुछ अधिक समय बिताने के बाद, आप निम्नलिखित कोड खंड का उपयोग करके अपवाद संदेश के लिए उपयोग कर सकते हैं

FaultException faultException = (FaultException)exception; 
MessageFault msgFault = faultException.CreateMessageFault(); 
XmlElement elm = msgFault.GetDetail<XmlElement>(); 

आप अपने सभी उत्तरों के लिए धन्यवाद।

+0

धन्यवाद, आप कोड ने मुझे अभी और मुझे अपनी समस्या को हल करने के बारे में विचार दिया है (कुछ घंटों से लड़ने के बाद)। यदि आप प्रतिबिंब के माध्यम से डब्ल्यूसीएफ प्रॉक्सी क्लास के तरीकों का आह्वान कर रहे हैं, तो आंतरिक रूप से गलती अपवाद के साथ उस clr फेंक प्रतिबिंब अपवाद से अवगत रहें। –

2

वेब सेवाएं सीधे अपवादों का उपयोग नहीं करती हैं। इसके बजाय, वे दोष लौटते हैं। डब्ल्यूएसडीएल <detail/> तत्व की सामग्री के साथ संभावित दोषों का वर्णन करने के लिए है। यह निर्धारित करने के लिए कि आपको कौन सी गलती वापस आ रही है, आपको डब्लूएसडीएल को देखना होगा।

यदि गलती का नाम SharePointFault है, तो डब्ल्यूसीएफ इसे FaultException<SharePointFault> नामक अपवाद में अनुवादित करेगा। इस अपवाद में शायद errorstring और errorcode के गुण होंगे। आपको गलती संदेश में भेजे गए मानों को पुनर्प्राप्त करने के लिए उन गुणों का उपयोग करने में सक्षम होना चाहिए।

+0

हम्म ... मुझे वेब सेवा की डब्लूएसडीएल परिभाषा में ऐसा विवरण दिखाई नहीं देता है। हालांकि अगर मैं उपर्युक्त वेब सेवा को सामान्य वेब संदर्भ के रूप में उपयोग करता हूं (सेवा संदर्भ के रूप में नहीं) तो मैं उपरोक्त अपवाद को System.Web.Services.Protocols.SoapException के रूप में पकड़ सकता हूं और मैं OuterXml या InnerXml गुणों को उपयोग करने वाले त्रुटि संदेशों तक पहुंच सकता हूं System.Web.Services.Protocols.SoapException ऑब्जेक्ट का। – Shamika

+0

यदि कोई wsdl नहीं है: गलती तत्व, तो आप http://msdn.microsoft.com/en-us/library/system.servicemodel.faultexception.createmessagefault.aspx का उपयोग करने के साथ अटक गए हैं। –

+0

हां यह एकमात्र विकल्प है – Shamika

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