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.
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.
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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With