通信异常,请自动重新连接

本文关键字:重新连接 异常 通信 | 更新日期: 2023-09-27 18:30:04

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

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

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

在我的案例中,我在客户端中获得了几个Agent类,这些类使用从ChannelFactory创建的单一IServceInterface运行服务方法。类似这样的东西:

MyServiceAgent.GetService().GetMyObjects

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

通信异常,请自动重新连接

我不会尝试使用消息检查器;当一个通道出现故障时,它会将硬错误(正如您所看到的,您会得到一个异常)。它用于指示该频道不再被视为有效,并且您不应该在其上进行呼叫。

你可能认为你可以在传输层做到这一点,但你需要协调它上面的层(为了转换通过电线传入的内容,你真的不应该访问),以确定你是否有故障。

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

请注意限制您执行的重试次数;如果你不这样做,你最终会得到一颗毒丸(你的代码会无限重试)。在某个时刻,会希望抛出异常。

您可以编写一个通用使用者,用于进行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