客户端的 WCF Web 服务自定义异常错误

Posted

技术标签:

【中文标题】客户端的 WCF Web 服务自定义异常错误【英文标题】:WCF Web Service Custom Exception Error to Client 【发布时间】:2010-11-25 02:06:46 【问题描述】:

我想抛出自定义异常,例如一些错误消息作为 WCF Web 服务的异常,并尝试在调用 Web 服务方法时在客户端应用程序中接收此异常错误消息。

如何从 WCF Web 服务抛出自定义异常并在客户端接收相同的异常错误。

WCF Web 服务方法:

    public bool Read()
    
        if (IsUserValid() == false)
        
            throw new Exception("Authorized user");
        
    

在客户端

try

   _client.Read();

catch (Exception e)

   MessageBox.Show(e.Message);
   return;

结果:始终将错误消息作为异常抛出**即

"System.ServiceModel.FaultException: 服务器无法处理 由于内部错误而请求。为了 有关错误的更多信息, 要么打开 IncludeExceptionDetailInFaults(要么 来自 ServiceBehaviorAttribute 或来自 配置 行为)在服务器上,以便 将异常信息发回给 客户端,或根据 Microsoft .NET Framework 3.0 SDK 文档并检查服务器 跟踪日志。”

这是代码抛出异常,但没有返回与从 WCF Web 服务抛出的相同错误消息作为异常错误

请推荐

【问题讨论】:

您可以在类似问题中找到答案:***.com/questions/5165004/… 【参考方案1】:

在 WCF 中,您不应该抛出标准 .NET 异常 - 这与 WCF 潜在的互操作性质相反 - 毕竟,您的客户端可能是没有 .NET 异常概念的 Java 或 php 客户端。

相反,您需要抛出 FaultExceptions(这是 WCF 的标准行为)。

如果您想传达有关问题所在的更多信息,请查看通用 FaultException<T> 类型:

服务器:

public bool Read()

    if (IsUserValid() == false)
    
        throw new FaultException<InvalidUserFault>("User invalid");
    

或者(如@MortenNorgaard 建议的那样):

public bool Read()  
 
    if (!IsUserValid()) 
     
        InvalidUserFault fault = new InvalidUserFault(); 
        FaultReason faultReason = new FaultReason("Invalid user"); 

        throw new FaultException<InvalidUserFault>(fault, faultReason); 
       

客户

try

   _client.Read();

catch (FaultException<InvalidUserFault> e)

    MessageBox.Show(e.Message);
    return;

您应该将您的 InvalidUserFault 声明为 WCF 数据协定,并定义哪些成员可以使用该类型返回(即错误代码、错误消息等)。

 [DataContract]
 [Serializable()]
 public class BusinessFault
 
   ... add your fault members here
 

然后你应该用它可能引发的错误来装饰你的服务方法:

[FaultContract(typeof(InvalidUserFault)]
[OperationContract]
public bool Read()
.....

当然,“quick'n'dirty” hack 只是简单地定义服务器在其 FaultExceptions 中返回异常详细信息:

<serviceBehaviors>
   <behavior name="EmployeeManager_Behavior">
      <serviceDebug includeExceptionDetailInFaults="true"/>
   </behavior>
</serviceBehaviors>

然后您可以检查 FaultException 的 .Detail 以了解服务器上发生的实际异常 - 但同样:这更像是仅在开发时进行的黑客攻击,而不是真正的解决方案。

马克

【讨论】:

这个throw new FaultException&lt;InvalidUserFault&gt;("User invalid");无效,你需要在ctor中传入一个实际的InvalidUserFault 我建议如下,因为故障原因似乎是 SOAP 规范所要求的(参考。***.com/questions/9614992/…) public bool Read() if (IsUserValid() == false) InvalidUserFault fault = 新的无效用户故障(); FaultReason faultReason = new FaultReason("无效用户"); throw new FaultException(fault, faultReason); @MortenNørgaard:谢谢 - 包括您的建议作为替代实现【参考方案2】:

要让它发挥作用,您需要做两件事:

在接口中定义故障契约(WCF 契约) 将异常作为故障异常抛出

【讨论】:

以上是关于客户端的 WCF Web 服务自定义异常错误的主要内容,如果未能解决你的问题,请参考以下文章

在 WCF/WIF 中,如何合并来自两个不同客户端的自定义 sts 令牌的声明

在WCF中,自定义Authentication,Validate方法,抛出错误异常时如何在不停止服务的情况下处理异常?

从服务器抛出的自定义错误未在客户端的 HttpErrorResponse 中返回

从自定义源(非标准 XML)加载 WCF 配置(用于服务器 + 客户端)

WCF c#中自定义类的传输问题

如何在 wcf 中添加自定义肥皂标题?