4

假设我有一个 WCF 客户端,它使用 channelfactory 与 IIS7(TCP) 中的 WCF 服务进行通信。如果通信中断(或服务回收),则来自客户端的下一次调用将导致异常。

此时我需要隐藏异常,而是尝试重新连接/重新登录。

问题是是否有任何简单的方法可以做到这一点,而无需在客户端的每个 ServiceAgentMethod 中添加处理代码?例如,这可以用 MessageInspector 解决吗?

在我的情况下,我在客户端中有几个代理类,它们使用从 ChannelFactory 创建的单个 IServceInterface 运行服务方法。像这样的东西:

MyServiceAgent.GetService().GetMyObjects

GetService() 将返回由 ChannelFactory 在登录时创建的 IServiceInterface。

4

2 回答 2

3

我不会使用消息检查器尝试它;当一个通道出现故障时,它会出现严重故障(如您所见,您会遇到异常)。它用于指示该通道不再被认为是有效的,并且您不应该对其进行调用。

您可能认为您可以在传输层执行此操作,但您需要协调其上方的各层(以便翻译通过线路输入的内容,您确实不应该访问)以确定不管你有没有过错。

最终,您会希望在调用代理的级别发出重试逻辑。在调用代理之前/之后截取客户端(接口)的抽象;如果出现异常,您可以重试调用,根据需要创建新的代理/通道。

小心限制您执行的重试次数;如果你不这样做,你最终会得到一颗毒丸(你的代码将无限重试)。在某些时候,您会想要抛出异常。

于 2012-04-04T14:43:20.157 回答
0

您可以编写一个可用于进行 WCF 调用的通用使用者。在提供的示例中,您可以指定重试计数,它可以更好地处理客户端的拆除和重新创建。

这仍将在客户端,但因为它是通用的并且隐藏了复杂性,我认为它是一个优雅的解决方案:

var consumer = new ServiceClientWrapper<AuthorServiceClient, AuthorService>();
author = consumer.Excecute(service => service.AddAuthor(request));

https://github.com/mariusvrstr/WcfClientStressTest/blob/master/Spike.Common/ServiceClientWrapper.cs

于 2017-02-11T14:17:44.057 回答