【问题标题】:WCF Web Service Custom Exception Error to Client客户端的 WCF Web 服务自定义异常错误
【发布时间】: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 服务抛出的相同错误消息作为异常错误

请推荐

【问题讨论】:

标签: wcf


【解决方案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 规范所要求的(参考。stackoverflow.com/questions/9614992/…) public bool Read() { if (IsUserValid() == false) { InvalidUserFault fault = 新的无效用户故障(); FaultReason faultReason = new FaultReason("无效用户"); throw new FaultException(fault, faultReason); } }
  • @MortenNørgaard:谢谢 - 包括您的建议作为替代实现
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 2023-03-19
    • 2011-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-19
    • 1970-01-01
    相关资源
    最近更新 更多