【问题标题】:Communication Exception and do reconnect automatic?通信异常并自动重新连接?
【发布时间】:2012-04-04 14:26:05
【问题描述】:

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

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

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

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

MyServiceAgent.GetService().GetMyObjects

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

【问题讨论】:

    标签: c# wcf fault


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 我不确定你的客户端界面是什么意思?一个想法是使用某种委托方法。假设该方法获取一个委托并返回一个对象。该方法将尝试运行委托(针对服务)并在需要时处理重新连接。当成功调用完成时,返回对象并让代理方法将其转换为正确的类型。这行得通吗?
    【解决方案2】:

    您可以编写一个通用的消费者来进行 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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-27
      • 2011-09-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-24
      相关资源
      最近更新 更多