通过 WCF 序列化异常

Posted

技术标签:

【中文标题】通过 WCF 序列化异常【英文标题】:Serializing exceptions over 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 上下文之外抛出的任何类型的异常,然后将它们引导回服务器以进行进一步处理。如果它对解决方案有帮助,服务器还可以连接回客户端。

【问题讨论】:

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

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

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

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

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

Specifying and Handling Faults in Contracts and Services WCF Error Handling and Fault Conversion WCF error handling and some best practices Exception Handling in WCF using Fault Contract Using the Fault Contracts (SOAP Faults) in WCF Programming

【讨论】:

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

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

【讨论】:

你发布这个已经有一段时间了,但我想我会让你知道我终于找到了一种方法。解决方案here。正如您所指出的,ExceptionDetail 可以工作,但仅限于服务器不需要反序列化的Exception 对象的情况下。这额外的一点点涵盖了它。

以上是关于通过 WCF 序列化异常的主要内容,如果未能解决你的问题,请参考以下文章

意外类型 - 序列化异常

WCF异常处理

WCF 服务已超出最大数组长度配额 (16384)

WCF传输1-你是否使用过压缩或Json序列化?

Web Service 或 WCF调用时读取 XML 数据时,超出最大字符串内容长度配额(8192)解决方法

再说WCF Data Contract KnownTypeAttribute