Мы подключаемся к веб-службе, и сообщение об ошибке, которое мы получаем, не десериализуется (вообще), и никакая версия класса, которую я могу сделать, не будет десериализоваться правильно. У нас нет контроля над серверной частью вещей. Сервер не разрешает обнаружение, поэтому добавление ?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/ Fiddler