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

Lal*_*rma 20 wcf

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

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

WCF Web服务方法:

    public bool Read()
    {
        if (IsUserValid() == false)
        {
            throw new Exception("Authorized user");
        }
    }
Run Code Online (Sandbox Code Playgroud)

在客户端

try
{
   _client.Read();
}
catch (Exception e)
{
   MessageBox.Show(e.Message);
   return;
}
Run Code Online (Sandbox Code Playgroud)

结果:始终将错误消息作为例外**即

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

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

请建议

mar*_*c_s 70

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

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

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

服务器:

public bool Read()
{
    if (IsUserValid() == false)
    {
        throw new FaultException<InvalidUserFault>("User invalid");
    }
}
Run Code Online (Sandbox Code Playgroud)

或者(由@MortenNorgaard建议):

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

        throw new FaultException<InvalidUserFault>(fault, faultReason); 
    }   
}
Run Code Online (Sandbox Code Playgroud)

客户:

try
{
   _client.Read();
}
catch (FaultException<InvalidUserFault> e)
{
    MessageBox.Show(e.Message);
    return;
}
Run Code Online (Sandbox Code Playgroud)

您应该声明您的InvalidUserFaultWCF数据合同,并定义哪些成员可以使用该类型返回(即错误代码,错误消息等).

 [DataContract]
 [Serializable()]
 public class BusinessFault
 {
   ... add your fault members here
 }
Run Code Online (Sandbox Code Playgroud)

然后你应该用你可能抛出的错误来装饰你的服务方法:

[FaultContract(typeof(InvalidUserFault)]
[OperationContract]
public bool Read()
.....
Run Code Online (Sandbox Code Playgroud)

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

<serviceBehaviors>
   <behavior name="EmployeeManager_Behavior">
      <serviceDebug includeExceptionDetailInFaults="true"/>
   </behavior>
</serviceBehaviors>
Run Code Online (Sandbox Code Playgroud)

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


Shi*_*iji 2

为了让它发挥作用,你需要做两件事:

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