Extracting detail from a WCF FaultException response

John picture John · May 13, 2013 · Viewed 16.7k times · Source

I am successfully working with a third party soap service. I have added a service reference to a soap web service which has auto generated the classes.

When an error occurs it returns a soap response like this:

<SOAP-ENV:Envelope xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
   <SOAP-ENV:Body>
      <SOAP-ENV:Fault>
         <faultcode>SOAP-ENV:Client</faultcode>
         <faultstring xsi:type="xsd:string">Error while reading parameters of method 'Demo'</faultstring>
         <detail xsi:type="xsd:string">Invalid login or password. Connection denied.</detail>
      </SOAP-ENV:Fault>
   </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

I can catch the error but not extract the detail. I have tried the following code:

catch (FaultException ex)
{
    MessageFault msgFault = ex.CreateMessageFault();
    var elm = msgFault.GetDetail<string>();
    //throw Detail
}

However it Errors with the following as detail node is not an object:

Expecting element 'string' from namespace 'http://schemas.datacontract.org/2004/07/MyDemoNamespace'.. Encountered 'Text'  with name '', namespace ''.

This is third party API so I cannot change the response.

Answer

John picture John · May 13, 2013

The detail node of the message fault is expected to contain XML. The GetDetail will deserialize this XML into the given object.

As the contents is not XML it was possible to use this method.

You can however get access to the XML and read the innerXml value:

MessageFault msgFault = ex.CreateMessageFault();
var msg = msgFault.GetReaderAtDetailContents().Value;

This approached worked.