通信异常并自动重新连接?

时间:2012-04-04 14:26:05

标签: c# wcf fault

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

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

问题是如果有任何简单的方法可以在客户端的每个ServiceAgentMethod中添加处理代码吗?例如,使用MessageInspector可以解决这个问题吗?

在我的例子中,我在客户端中获得了几个Agent类,它们使用从ChannelFactory创建的单个IServceInterface来运行服务方法。像这样:

MyServiceAgent.GetService().GetMyObjects

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

2 个答案:

答案 0 :(得分:3)

我不会使用message inspector来尝试;当一个通道发生故障时,它会出现 hard (如你所见,你得到一个例外)。它用于表示该频道不再被视为有效,并且您不应该对其进行调用。

您可能认为可以在传输层执行此操作,但是您需要协调其上方的层(以便将通过线路传输的内容转换为您真正无法访问的内容)以确定您是否有过错。

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

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

答案 1 :(得分: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