[英]WCF Service - Recover from network outage
我在使用Azure Service Bus中繼的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();
我的最后一招是創建一個任務,每隔一段時間輪詢一次服務,以檢測服務是否已連接。
對於這種情況,我的解決方案是在Windows服務中創建后台線程,該線程在您的廁所中以指定的時間間隔不斷檢查網絡接口的狀態是向上還是向下。
然后,觸發重新創建WCF服務,但請確保正確關閉並處置/清理服務主機。
您可以使用以下代碼來檢查網絡可用性 :
bool networkUp
= System.Net.NetworkInformation.NetworkInterface.GetIsNetworkAvailable();
或檢查特定接口的狀態
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
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.