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

标签 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>

此外,这是在.net 4.0中,并且我们使用的是CaSTLe的WCF工具(DefaultServiceModel和RestServiceModel)。

最佳答案

由于安全原因,WCF在默认情况下和设计上将不报告详细的错误信息。它基本上只会告诉您“服务器上出了点问题-运气不好”。

您可以-为了进行开发和测试-启用更详细的错误信息,但应将其关闭以进行生产。

为此,请在服务器上使用服务行为:

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

   <services>
      <service name="YourService"
               behaviorConfiguration="DetailedDebugging" >
          ....
      </service>
   </services>
</system.serviceModel>

现在,您的服务应该向后报告详细的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>();
   }
}

这是否使您可以访问有关SOAP故障的详细描述?

关于WCF故障异常不会在客户端上显示 SOAP 服务的详细信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5119464/

相关文章:

wcf - 通过 channel 接口(interface)支持消息级安全性的最小客户端

wcf - .NET Core RC2 - 使用外部 WCF

c# - WCF 服务中的错误报告?

c# - 在与服务线程不同的线程上运行服务操作

wpf - 此 WCF 错误 : "Custom tool warning: Cannot import wsdl:portType" 是什么意思

c# - 无法返回类型 IQueryable 或 IEnumerable

wcf - 使用 DataContractAttribute 和 ISerializable

c# - WCF 跟踪文件不断损坏?

wcf - 使用 -Namespace 时 New-WebServiceProxy cmdlet 中存在错误?

WCF - 通过 http 的流式文件上传