tags:

views:

442

answers:

2

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"&gt;
    <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/"&gt;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/"&gt;0x81020071&lt;/errorcode&gt;
            </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.

+1  A: 

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.

John Saunders
Hmm... I don't see such description in the WSDL definition of the web service. However if I use the above web service as a normal web reference (not as a service reference) I can catch the above exception as a System.Web.Services.Protocols.SoapException and I can access the error messages uing the OuterXml or InnerXml properties of the System.Web.Services.Protocols.SoapException object.
Shamika
If there are no wsdl:fault elements, then you're stuck with using http://msdn.microsoft.com/en-us/library/system.servicemodel.faultexception.createmessagefault.aspx.
John Saunders
Yes that's the only option
Shamika
+2  A: 

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.

Shamika