0

我有一个调用 asmx Web 服务的 WCF 服务。该 Web 服务会引发如下所示的异常:

        <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 属性。如何获得此异常的详细信息?

4

2 回答 2

1

在玩了很长时间之后,我发现在 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”。来自问题中的示例错误。

于 2013-09-28T03:30:58.457 回答
-2

在对 Web 服务的调用周围使用 try catch 块,然后捕获肥皂异常

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)where T 是包含细节的对象的类型。然后,您可以在外面捕捉它FaultException<T>并以这种方式查看详细信息。T 可能是一个复杂类型,如果是这样,你必须用[DataContractAttribute]

于 2013-09-27T22:34:51.763 回答