我在使用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();
我的最后一招是创建一个每隔一段时间轮询一次服务的任务,以检测服务是否已连接。
答案 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
}