. NET Core C# интеграция с SOAP 1.1 веб-сервисом, может перехватывать generi c FaultException, но не может десериализовать детали - PullRequest
0 голосов
/ 15 апреля 2020

В базовом приложении. 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. Любая помощь приветствуется ... спасибо.

...