Клиент 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]