WCF故障异常不会在客户端上显示soap服务的详细信息

Mic*_*ael 10 wcf

我们为服务提供了REST和SOAP端点,因此我们使用WebFaultException传递友好消息.这对于REST调用非常有用,而不是SOAP调用.下面是跟踪,清楚地显示了"detail"元素中的友好消息.但是在客户端上引发的FaultException在消息中具有http状态代码描述 - 而不是从服务引发的真实消息.有没有办法在客户端上显示预期的消息?

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
   <s:Header></s:Header>
   <s:Body>
      <s:Fault>
         <faultcode xmlns:a="http://schemas.microsoft.com/2009/WebFault" xmlns="">a:BadRequest</faultcode>
         <faultstring xml:lang="en-US" xmlns="">Bad Request</faultstring>
         <detail xmlns="">
            <string xmlns="http://schemas.microsoft.com/2003/10/Serialization/">Country code must be 3 characters.</string>
         </detail>
      </s:Fault>
   </s:Body>
</s:Envelope>
Run Code Online (Sandbox Code Playgroud)

此外,这是在.net 4.0中,我们正在使用Castle的WCF工具(DefaultServiceModel和RestServiceModel).

mar*_*c_s 12

出于安全原因,WCF将 - 默认情况下并按设计 - 不报告详细的错误信息.它基本上只会告诉你"服务器出了问题 - 运气不好".

您可以 - 出于开发和测试目的 - 启用更详细的错误信息,但您应该将其关闭以进行生产.

要启用它,请在服务器上使用服务行为:

<system.serviceModel>
   <behaviors>
      <serviceBehaviors>
         <behavior name="DetailedDebugging">
             <serviceDebug includeExceptionDetailInFaults="True" />
         </behavior>
      </serviceBehaviors>
   </behaviors>

   <services>
      <service name="YourService"
               behaviorConfiguration="DetailedDebugging" >
          ....
      </service>
   </services>
</system.serviceModel>
Run Code Online (Sandbox Code Playgroud)

现在,您的服务应该报告详细的SOAP错误,包括所有详细信息,一直回到您的客户端应用程序.

更新:如果我没有记错,处理标准(非类型化)时FaultException,你很容易获得喜欢的内容FaultCodeFaultReason等,但该消息的细节有点麻烦得到它-尝试是这样的:

try
{
   // your service call here
}
catch(FaultException fe)
{
   FaultCode fc = fe.Code;
   FaultReason fr = fe.Reason;

   MessageFault mf = fe.CreateMessageFault();
   if(mf.HasDetail)
   {
      string detailedMessage = mf.GetDetail<string>();
   }
}
Run Code Online (Sandbox Code Playgroud)

这是否允许您访问SOAP错误的详细描述?