Espaços de nome múltiplos em uma mensagem de falha de sabão causando falha na desserialização do FaultException
Estamos nos conectando a um serviço da Web e a mensagem de falha que estamos recebendo não está desserializando (de jeito nenhum) e nenhuma versão de classe que eu possa fazer desserializará corretamente. Nós não temos controle sobre o lado do servidor das coisas. O servidor não permite a descoberta, portanto, incluir? WSDL no final da URL do nó de extremidade resulta em um erro, não em um WSDL.
[Fiddler] [1] mostra que a mensagem de falha que está voltando parece com:
<?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>
No entanto, nenhuma classe que fizemos (tentando xsd.exe, svcutil e outros, incluindo código que escrevemos do zero) pode desserializá-lo quando tentamos pegá-lo com:
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.
}
Apenas a captura de base FaultException será chamada, o que significa que perderemos o conteúdo da mensagem de falha que está sendo enviada. Algumas das classes que escrevi serão serializadas muito de perto para o exemplo acima, mas falham em desserializá-lo, então nossa suspeita é de que há um problema de namespace.
Questões:
1 - Como você escreveria isso?
2 - Este é um erro / problema comum no WCF?
[1]:http://www.fiddler2.com/fiddler2/ Violinista