В базовом приложении. NET у меня есть интеграция с сторонним веб-сервисом XML / SOAP. Я использовал do tnet -svcutil, чтобы сгенерировать ссылку на службу из стороннего WSDL, и использую эту ссылку на службу, чтобы сделать клиентский вызов веб-службы и вернуть ответ как объект. Ответы: SOAP 1.1, и в справке WSDL / service не указаны типы ошибок. Я успешно вызвал веб-сервис и во время тестирования получил ошибку soap, как показано ниже:
<?xml version="1.0" encoding="utf-8"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
<SOAP-ENV:Body>
<SOAP-ENV:Fault>
<faultcode>SOAP-ENV:Server</faultcode>
<faultstring xml:lang="en">Fault</faultstring>
<detail>
<cause>UnrecoverableClientError</cause>
<code>SchemaError</code>
<desc>validation failure ...</desc>
</detail>
</SOAP-ENV:Fault>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
В то время как вызов службы * go входит в мою ловушку для FaultException (без типа), Я не могу получить доступ к деталям. Я пробовал множество вещей из других постов ...
} catch(FaultException fe) {
var messageFault = fe.CreateMessageFault();
if(messageFault.HasDetail) {
// tried to get an xml reader...also tried deserializing it into an object which didn't work
using(XmlDictionaryReader reader = messageFault.GetReaderAtDetailContents()) {
//var test = reader.; // first and last element is cause
}
// another try at xml reader
var errorElement = XElement.Parse(fe.CreateMessageFault().GetReaderAtDetailContents().ReadOuterXml());
var errorDictionary = errorElement.Elements().ToDictionary(key => key.Name.LocalName, val => val.Value);
var errorMessage = errorDictionary?["desc"];
// tried getting detail
var detail = messageFault.GetDetail<XmlElement>();
errorMessage = detail.InnerText;
/*
var code = detail.GetElementsByTagName("code")[0]?.InnerText;
var desc = detail.GetElementsByTagName("desc")[0]?.InnerText;
errorMessage = desc;
*/
}
}
Во всех моих испытаниях я могу получить либо 1-й элемент "причина" (например, UnrecoverableClientError), либо пустые / пустые результаты. Я надеялся захватить элемент 'des c'. FaultException CreateMessageFault поддерживает как SOAP 1.1, так и 1.2. Интересно, если он, 1.1, не предоставляет доступ ко всем элементам detail и есть ли обходной путь? Я не могу контролировать / изменять сервис, и я предпочел бы не редактировать WSDL. Любая помощь приветствуется ... спасибо.