【问题标题】:Serializing exceptions over WCF通过 WCF 序列化异常
【发布时间】:2010-12-28 03:49:43
【问题描述】:

我有一个在远程系统上运行的任务,它使用 WCF 连接回服务器。该任务很可能会引发异常,我希望将这些异常引导回服务器。基本上我想做这样的事情:

客户:

server.SendException(new UnauthorizedAccessException("Some Exception"));

服务器:

public void SendException(Exception e)
{
    throw e;
}

合同:

[ServiceContract]
public interface IServerContract
{
    [OperationContract]
    void SendException(Exception e);
}

我已经阅读了一些有关故障异常的信息,但据我了解,它们用于在称为 WCF 的方法中运行的特定异常。我想要的是发送应用程序在 WCF 上下文之外抛出的任何类型的异常,然后将它们引导回服务器以进行进一步处理。如果它对解决方案有帮助,服务器还可以连接回客户端。

【问题讨论】:

  • 那么基本上,如果客户端抛出异常,你希望它登录到服务器上?
  • 有可能,但我认为您可能需要提供有关服务、客户端和应用程序之间的通信链的更多细节?它可能会帮助您从某人那里得到可靠的答案。准确地按照您的需要进行操作有点困难。

标签: c# wcf exception-handling


【解决方案1】:

您需要在服务器上捕获异常并将它们打包成 SOAP 错误,然后通过网络将它们发送回来。否则,您的客户端-服务器通道将“出现故障”且无法使用。

SOAP 错误基本上是 .NET 异常的可互操作 SOAP 等价物。您不应该抛出 .NET 异常,因为它们是特定于 .NET 的 - WCF 和 SOA 根据定义与系统无关。

如果确实保证通信线的两端都是 .NET,您可以轻松地将任何 .NET 异常包装到 FaultException<T> 中,从而使用符合 SOAP 的“传输工具”轻松地返回 .NET 特定异常信息.

在此处阅读有关 SOAP 错误以及如何将服务器上的 .NET 异常转换为网络上的 SOAP 错误的更多信息:

【讨论】:

  • 这是我发现大多数地方要说的,不幸的是我需要它朝另一个方向发展,因为我试图捕获客户端异常并将它们发送到服务器。
  • 好吧,使用相同的机制:创建一个服务方法,例如“ReceiveFault”,并将它的参数设为“FaultException”。现在,从客户端,当出现问题时,将您的 .NET 异常包装到 FaultException 并在您的服务器上调用“ReceiveFault”
  • 虽然我选择的方法有效,但这可能是更合适的方法。
  • @marc_s 在其中一个服务合同中我没有实现逻辑所以我得到了这个throw new NotImplementedException();。怎么不序列化到前端浏览器(配合webhttp使用)
【解决方案2】:

对于我所需要的,我解决了我自己的问题。我使用了 ServiceModel 提供的 ExceptionDetail 类,并将相关的异常数据发送回服务器。

【讨论】:

  • 你发布这个已经有一段时间了,但我想我会让你知道我终于找到了一种方法。解决方案here。正如您所指出的,ExceptionDetail 可以工作,但仅限于服务器不需要反序列化的Exception 对象的情况下。这额外的一点点涵盖了它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多