我有一个调用asmx Web服务的WCF服务。该Web服务抛出一个如下所示的enxception:
<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属性。我怎样才能了解此例外的详细信息?
答案 0 :(得分: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;
}
这会产生“无效ID”。来自问题中的样本错误。
答案 1 :(得分:-2)
在Web服务调用周围使用try catch块,然后捕获soap异常
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]