WCF客户端Windows服务 - 如何处理连接错误?

时间:2016-06-17 15:53:45

标签: vb.net wcf

我在客户端计算机上运行Windows服务,该服务器使用WCF与我们的服务器通信。基本流程如下:

  1. 客户端每隔3分钟使用DuplexChannelFactory(CreateChannel)建立与服务器的连接。
  2. 当此连接打开时,服务器会向客户端发送消息。
  3. 连接必须始终保持打开状态,因为服务器可能需要随时与客户端通信。这就是为什么我们每隔几分钟刷新一次连接。

    在大多数情况下,这个系统工作正常。但是,如果客户端具有不稳定的Internet连接,则通道将中止。这是在这种情况下发生的事情:

    1. 客户端打开连接。此连接保持打开状态3分钟,直至关闭并重新打开。
    2. 在第一次连接期间,计算机将丢失Internet连接几秒钟。
    3. 在客户端上运行的Windows服务会引发System.Net.Sockets.SocketException和System.ServiceModel.CommunicationException。该代码目前没有捕获这些例外。
    4. 计算机重新连接互联网。
    5. 服务器尝试与客户端通信(仍在前3分钟内)。
    6. 由于第一个连接仍处于打开状态,因此服务器无法通信并收到以下错误:通信对象System.ServiceModel.Channels.ServiceChannel不能用于通信,因为它已被中止。
    7. 我正在试图找出如何捕获步骤3中发生的错误,以便我可以关闭当前连接并重新打开它。我目前有一个处理Faulted事件的函数,但是当连接丢失时不会触发此事件。我已经尝试过调查全局错误处理,但似乎大多数教程都是针对服务器端的,而不是客户端。此外,由于连接只是无限期地保持打开状态,因此我无法放置try / catch块,因为在它发生时没有实际运行的代码。

1 个答案:

答案 0 :(得分:0)

我能够通过使用FirstChanceException事件处理程序来完成捕获这些异常。我不得不使用这个事件,因为异常是自动深入处理的,所以我无法抓住它们。

在Windows服务的OnStart功能中:

 Dim currentDomain As AppDomain = AppDomain.CurrentDomain
 AddHandler currentDomain.FirstChanceException, AddressOf HandleException

我编写的函数检查异常是否属于某种类型我知道连接失败并且我创建了一个新连接。