Wiele obszarów nazw w komunikacie o błędzie mydła powodującym niepowodzenie deserializacji FaultException

Łączymy się z usługą internetową, a komunikat o błędzie, który otrzymujemy, nie jest deserializacją (w ogóle), a żadna wersja klasy, którą mogę zrobić, nie spowoduje deserializacji poprawnie. Nie mamy kontroli nad stroną serwera. Serwer nie zezwala na wykrywanie, więc dodanie pliku WSDL na końcu adresu URL punktu końcowego powoduje błąd, a nie WSDL.

[Skrzypek] [1] pokazuje, że komunikat o błędzie wraca wygląda tak:

<?xml version="1.0" encoding="UTF-8"?>
<soapenv:Envelope xmlns:eGov="http://eGov.gov" xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
  <soapenv:Body>
    <soapenv:Fault>
    <faultcode>Client</faultcode>
    <faultstring/>
      <detail>
        <eGov:eGov2Exception>
          <eGov:ErrorClassification>SOME_ERROR</eGov:ErrorClassification>
          <eGov:ErrorCode>SOME_ERROR_CODE</eGov:ErrorCode>
          <eGov:ErrorMessage>Your request was unsuccessful. blah blah blah.</eGov:ErrorMessage>
        </eGov:eGov2Exception>
      </detail>
    </soapenv:Fault>
  </soapenv:Body>
</soapenv:Envelope>

Jednak żadna klasa, którą stworzyliśmy (próbując xsd.exe, svcutil i innych, w tym kodu, który napisaliśmy od podstaw), nie może go rozszeregować, gdy spróbujemy go złapać:

catch (FaultException<eGov2ExceptionType> exp)
  {
     // Never stops here. 
  }
catch (FaultException<AllOtherAttemptedClasses> exp)
  {
     // Never stops here. 
  }
catch (SoapException se)
  {
     // Never stops here. 
  }
catch (FaultException exp)
  {
     //Always gets caught here. 
  }

Wywołany zostanie tylko podstawowy chwyt FaultException, co oznacza, że ​​tracimy zawartość wysyłanego komunikatu FaultMessage. Niektóre z klas, które napisałem, naprawdę serializują ściśle powyższą próbkę, ale nie rozróżniają jej, więc podejrzewamy, że istnieje problem z przestrzenią nazw.

Pytania:

1 - Jak byś to napisał?

2 - Czy jest to częsty błąd / problem z WCF?

[1]:http://www.fiddler2.com/fiddler2/ Skrzypek

questionAnswers(3)

yourAnswerToTheQuestion