2013-09-27 2 views
0

У меня есть служба WCF, которая вызывает веб-службу asmx. Это веб-сервис бросает enxception который выглядит следующим образом:WCF Client Catching SoapException from asmx webservice

 <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 однако он не имеет данные свойства. Как я могу узнать подробности этого Исключения?

ответ

0

После долгого общения с этим я обнаружил, что с объекта 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; 
    } 

Это дает «Недопустимый идентификатор». от ошибки выборки в вопросе.

-2

использовать попытка поймать блок вокруг вызова веб-службы, а затем поймать за исключением мыло

catch (SoapException e) 
{ 
    e.Detail 
} 

если вы хотите бросить неосновные FaultExceptions, (то есть те, которые содержат детали), вам нужно чтобы добавить это поведение к вашему 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]

+0

«В C# я могу поймать его как исключение FaultException, но у него нет свойства свойств». – Gratzy

+0

Вы звоните в старую веб-службу, или ваш WCF вызывает другой WCF? вы ловите исключение в своей службе WCF, или вы ловите его в вызывающей программе. – ohmusama

+0

Его все в вопросе, я звоню в службу asmx Я поймаю его в службе wcf – Gratzy