Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Catching FaultException in WebServices

Tags:

c#

wcf

sharepoint

I'm calling a C# web service using the .net Service Model and occasionally this web service throws Microsoft.SharePoint.SoapServer.SoapServerException. I can catch this particular exception as a FaultException in my client code however I cannot get the friendly error message returned by the web service using FaultException.

Following is the network trace for the web service when there is an exception.

<?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>

I'm very interested in getting the content between errorstring node in the above response. However from FaultException class I cannot retrieve the above error message. Does that mean the .NET framework doesn't deserialize the above response correctly or am I using the wrong excepetion class here.

The only error message I could get from FaultException is "Exception of type 'Microsoft.SharePoint.SoapServer.SoapServerException' was thrown" nothing else.

Please note that I don't have any control over web service.

like image 577
Shamika Avatar asked Dec 16 '09 04:12

Shamika


2 Answers

After spending some more time on this I was able to find a solution, you can get access to the exception message by using the following code segment,

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

Thank you all for your replies.

like image 147
Shamika Avatar answered Sep 30 '22 13:09

Shamika


Web Services do not directly use exceptions. Instead, they return faults. The WSDL is meant to describe the possible faults, along with the contents of the <detail/> element. You will need to look at the WSDL to determine which fault is being returned to you.

If the fault is named SharePointFault, then WCF will translate that into an exception named FaultException<SharePointFault>. This exception will probably have properties for errorstring and errorcode. You should be able to use those properties to retrieve the values sent in the fault message.

like image 39
John Saunders Avatar answered Sep 30 '22 13:09

John Saunders