首页 文章

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

提问于
浏览
20

我想抛出自定义异常,如一些错误消息作为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 回答

  • 2

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

    • 在界面中定义故障 Contract (WCF Contract )

    • 将异常抛弃为故障异常

  • 69

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

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

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

    SERVER:

    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); 
        }   
    }
    

    CLIENT

    try
    {
       _client.Read();
    }
    catch (FaultException<InvalidUserFault> e)
    {
        MessageBox.Show(e.Message);
        return;
    }
    

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

    [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 以查找服务器上发生的实际异常 - 但同样:这更像是一个开发时间而不是真正的解决方案 .

相关问题