来自asmx webservice的WCF客户端捕获SoapException

时间:2013-09-27 22:25:38

标签: c# wcf asmx faultexception soapfault

我有一个调用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属性。我怎样才能了解此例外的详细信息?

2 个答案:

答案 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]

修饰该类型