Мы подключаемся к веб-службе, и возвращаемое нами сообщение об ошибке не десериализуется (вообще), и ни одна из версий класса, которые я могу создать, не будет десериализована правильно. У нас нет контроля над серверной стороной вещей. Сервер не разрешает обнаружение, поэтому добавление? WSDL в конец URL-адреса конечной точки приводит к ошибке, а не к WSDL.
[Fiddler] [1] показывает, что возвращаемое сообщение об ошибке выглядит следующим образом:
<?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>
Тем не менее, ни один из созданных нами классов (пробующий xsd.exe, svcutil и другие, включая код, написанный с нуля) не сможет десериализовать его, когда мы попытаемся поймать его с помощью:
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.
}
Будет вызван только базовый улов FaultException, что означает потерю содержимого отправляемого сообщения FaultMessage. Некоторые из классов, которые я написал, будут сериализованы очень близко к примеру выше, но не смогут его десериализовать, поэтому мы подозреваем, что существует проблема с пространством имен.
Вопросы:
1 - Как бы вы написали это?
2 - Это распространенная ошибка / проблема с WCF?
[1]: http://www.fiddler2.com/fiddler2/ Скрипач