WCF服务 - 从网络中断中恢复

时间:2015-08-17 19:42:44

标签: c# wcf azure

我在使用Azure Service Bus Relay的Window服务中托管了WCF服务。它在transferMode =" Streamed"中使用netTcpRelayBinding。它向连接到它的客户端公开了内部部署功能。

<bindings>
  <netTcpRelayBinding>
    <binding name="netTcpRelayBinding" closeTimeout="01:00:00" openTimeout="01:00:00" receiveTimeout="01:00:00" sendTimeout="01:00:00"
      maxBufferPoolSize="1048576" maxReceivedMessageSize="1048576000" maxBufferSize="1048576" transferMode="Streamed" maxConnections="200"
      listenBacklog="200"/>
  </netTcpRelayBinding>
</bindings>

问题:如何从网络中断中恢复并尝试重新打开连接?

我认为在测试期间在我的PC上禁用网络适配器时会发生故障或关闭事件,但它永远不会被触发。

_serviceHost = new ServiceHost(typeof(MyService));

_serviceHost.Faulted += _serviceHost_Faulted;
_serviceHost.Closing += _serviceHost_Closing;
_serviceHost.Closed += _serviceHost_Closed;
_serviceHost.Opened += _serviceHost_Opened;
_serviceHost.UnknownMessageReceived += _serviceHost_UnknownMessageReceived;

_serviceHost.Opened();

我的最后一招是创建一个每隔一段时间轮询一次服务的任务,以检测服务是否已连接。

1 个答案:

答案 0 :(得分:0)

我对此方案的解决方案是在您的Windows服务中创建后台线程,如果您的厕所中指定的时间间隔内状态为up或down,则会不断检查网络接口。

然后,触发重新创建WCF服务,但请确保正确关闭并清理/清理服务主机。

您可以使用此代码检查network availability

bool networkUp
= System.Net.NetworkInformation.NetworkInterface.GetIsNetworkAvailable();

或检查特定的interface's status

NetworkInterface[] networkCards
= System.Net.NetworkInformation.NetworkInterface.GetAllNetworkInterfaces();

其他选项是,如果您不想要线程和循环。您可以使用NetworkChange并挂钩事件,以便在适当的网络状态下重新创建服务基础。

using System.Net.NetworkInformation;

NetworkChange.NetworkAddressChanged += new 
        NetworkAddressChangedEventHandler(AddressChangedCallback);

NetworkChange.NetworkAvailabilityChanged += new
        NetworkAvailableEventHandler(networkAvailableEventHandler);

static void AddressChangedCallback(object sender, EventArgs e)
{
     // do your checking here
     // re-create you service base on appropriate status            
}

static void networkAvailableEventHandler(object sender, NetworkAvailableEventArgs e)
{
    // do your checking here
    // re-create you service base on appropriate status
}