【问题标题】:WCF Service - Recover from network outageWCF 服务 - 从网络中断中恢复
【发布时间】:2015-08-17 19:42:43
【问题描述】:

我有一个托管在使用 Azure 服务总线中继的 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();

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

【问题讨论】:

    标签: c# wcf azure


    【解决方案1】:

    我对这种情况的解决方案是在您的 Windows 服务中创建后台线程,以在您的厕所中以指定的时间间隔不断检查网络接口的状态是否正常。

    然后,触发您的 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
    }
    

    【讨论】:

    • 感谢您的彻底回复。我试试看。
    猜你喜欢
    • 2023-03-03
    • 2015-02-11
    • 2010-11-24
    • 2010-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-18
    • 2017-11-19
    相关资源
    最近更新 更多