Клиент WCF, получающий исключение SoapException от asmx webservice

У меня есть служба WCF, которая вызывает веб-службу asmx. Этот веб-сервис создает исключение, которое выглядит следующим образом:

        <soap:Body>
        <soap:Fault>
            <faultcode>soap:Server</faultcode>
            <faultstring>System.Web.Services.Protocols.SoapException:  error
                         service.method()</faultstring>
            <faultactor>https://WEBADDRESS</faultactor>
            <detail>
                <message>Invalid ID</message>
                <code>00</code>
            </detail>
        </soap:Fault>
    </soap:Body>

В C# я могу поймать его как FaultException, однако он не имеет свойства details. Как я могу получить подробную информацию об этом исключении?

2 ответа

Решение

После долгих раздумий с этим я обнаружил, что из объекта FaultException вы можете создать MessageFault. MessageFault имеет свойство HasDetail, которое указывает, присутствует ли подробный объект. Оттуда вы можете получить объект Detail как XmlElement и получить его значение. Следующий блок catch работает хорошо.

 catch (System.ServiceModel.FaultException FaultEx)
  {
   //Gets the Detail Element in the
   string ErrorMessage;
   System.ServiceModel.Channels.MessageFault mfault = FaultEx.CreateMessageFault();
   if (mfault.HasDetail)
     ErrorMessage = mfault.GetDetail<System.Xml.XmlElement>().InnerText;
  } 

Это приводит к "Неверный идентификатор". из образца неисправности в вопросе.

Использовать блок try catch для вызова веб-службы, а затем перехватить исключение мыла

catch (SoapException e)
{
    e.Detail
}

если вы хотите выбросить неосновные исключения FaultException (т.е. те, которые содержат детали), вам нужно добавить это поведение в ваш файл web.config и прикрепить его к вашему service используя behaviorConfiguration приписывать.

  <serviceBehaviors>
    <behavior name="YourServiceNameOrAnythingReallyServiceBehavior">
      <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true" />
      <serviceDebug includeExceptionDetailInFaults="true" />
    </behavior>
  </serviceBehaviors>

Тогда вы хотели бы бросить new FaultException<T>(T) где T - тип объекта, который содержит детали. Вы можете поймать его снаружи как FaultException<T> и посмотреть детали таким образом. T может быть сложным типом, если это так, вы должны украсить этот тип с помощью [DataContractAttribute]

Другие вопросы по тегам