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

时间:2009-09-02 20:15:19

标签: wcf

我想将自定义异常(例如某些错误消息)作为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服务抛出的异常错误相同的错误消息

请建议

2 个答案:

答案 0 :(得分:70)

在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”黑客只是简单地定义服务器在其FaultExceptions中返回异常细节:

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

然后你可以检查FaultException的.Detail以查找服务器上发生的实际异常 - 但是再次:这更像是一个开发时间而不是真正的解决方案。

马克

答案 1 :(得分:2)

要实现这一点,您需要做两件事:

  • 在界面中定义故障合同(WCF合同)
  • 将异常作为错误异常抛出