1

我正在开发 WCF 服务,如果出现错误,我想从服务上调用的原始方法序列化传入参数。我正在使用 IErrorHandler 来捕获所有异常。

我最初的想法是将序列化参数存储在 OperationContext.IncomingMessageProperties 中,以便我可以从 HandleError 方法中访问它。但是,由于这不是在原始线程上运行的,我相信 OperationContext 将为空,所以我正在考虑从 ProvideFault 方法访问它。

这看起来可行吗?它是否适用于 OneWay 服务调用?

4

1 回答 1

2

不确定我在这里能不能真正帮助你,但让我试试:

在您的客户端上,您的代码基本上调用一个方法并传递它的参数。然后,客户端的 WCF 堆栈将其转换为带有标头和所有内容的 SOAP 消息(通常带有 XML 正文,但也可以是二进制的),然后将该消息通过线路发送到服务器以进行处理。

然后,服务器尝试将该消息反序列化为一个对象,并尝试调用服务器实现对象上的消息。服务器对象上的该方法很可能再次具有与客户端相同的参数 - 但是,调用可能会在该方法被调用之前失败。

所以我想说的是:你不能依赖这样一个事实,即你的服务器端方法及其参数真的被调用了——例如身份验证、消息格式、缺少标头或其他东西可能存在问题否则,即使在调用服务器端方法之前,这也会导致服务器端失败并引发异常。

最后,在 IErrorHandler 中,我无法知道获取消息和/或方法及其参数 - 你所能得到的只是服务器上发生的错误,你可以用它来把它变成一个 SOAP 错误。

你可以做的——在客户端和服务器端——是创建一个插入 WCF 堆栈的新行为,并记录被调用的方法和传递给它们的参数——通过实现一个实现IParameterInspector接口的类WCF。但是只有在客户端和服务器上的消息将被正确反序列化并且服务器端方法真正被调用时才会被调用。

查看其中一些链接以获取有关 WCF 可扩展性的更多信息:

希望这个对你有帮助!

马克

于 2009-08-02T08:05:32.220 回答