2014-10-03 117 views
1

我用TCP綁定創建了一個本地WCF服務。當我的服務突然停止時,我想處理這個案子。我知道如何檢查服務何時停止在客戶端,但我不知道如何檢查服務何時恢復在線。WCF發佈是正確的選擇嗎?

簡而言之,我希望我的客戶端能夠在服務重新啓動時自動創建新的正確連接。
在檢查了互聯網後,我發現了WCF公告功能,但是我沒有找到如何使用公告功能的明確示例。

請注意,客戶端連接對象(服務)由Visually Studio通過輸入服務引用自動創建,而不是由我自己創建。
我的服務具有靜態IP地址,所有客戶端都將位於本地網絡上。

我的問題是,這是WCF公告的正確選擇還是有任何其他解決方案?

+0

如何在您的wcf服務中添加健康檢查操作合同並從客戶端ping此操作 – 2014-10-03 23:09:18

回答

0

有兩種方法一般方法你可以去這樣做,你需要做什麼:

既然你有你的服務的靜態IP地址,你可以使用具有「檢查在線」的老方法您的客戶端上的計時器事件會在連接到服務時丟失,並且繼續通過調用您的WCF服務上的特定方法來查看服務何時重新啓動以回覆True/All-OK 此方法的問題是許多:

  • 您需要有一種方法來更改IP地址在每個客戶端的配置上,這可能會造成維護噩夢。
  • 如果您有許多客戶端應用程序每隔幾秒輪詢一次以查看它是否再次運行,那麼您可能會很難找到服務。
  • 當服務再次可用時,您將有一個延遲時間,最長爲輪詢間隔的持續時間。

因此,使用WCF發現方法會更好,因爲那麼您的客戶端將等待服務再次返回到聯機狀態,並宣佈它已準備就緒,並且不會使用不需要的流量佔用本地網絡。 以下網站上有實例和解釋如何使用WCF發現功能:

希望所有這些頁面都可以使用您的語言。

+0

我嘗試關注[link](http://www.c-sharpcorner.com/uploadfile/54db21/announcing-online-events -in-wcf-service /),即我在中添加了,並在服務器的配置中添加了發現終點。之後,我在客戶端創建了AnnounceService並訂閱了事件但事件不會觸發不僅當服務上線時,而且當它斷開連接時。任何幫助是欣賞。 – 2014-10-04 08:22:05

+0

我不知道這是否會有所幫助,但這裏是我的測試方法。在生產之前,該服務是在「WCF服務應用程序」項目類型中創建的,並未由IIS或任何自託管方法託管。我首先嚐試運行客戶端應用程序,然後嘗試運行我的服務。「OnlineAnnouncementReceived」事件不會觸發。然後我嘗試強制關閉我的服務。「OfflineAnnouncementReceived」事件不會觸發。WCF公告服務是否可以工作服務未正常關閉的情況,如電力中斷或突發網絡問題,即沒有以正確的方式關閉? – 2014-10-04 08:37:27

0

爲了使公告工作,服務器端需要添加到在這樣

<serviceBehaviors> 
    <behavior name="MyServiceBehavior"> 
     <serviceDebug includeExceptionDetailInFaults="true" /> 

     <serviceDiscovery> 
     <announcementEndpoints> 
      <endpoint kind="udpAnnouncementEndpoint"/> 
     </announcementEndpoints> 
     </serviceDiscovery> 

     <serviceMetadata /> 
    </behavior> 
    </serviceBehaviors> 

一個服務器端的配置文件的服務行爲添加標記,並添加一個新的終點在這樣

<services> 
    <service behaviorConfiguration="MyServiceBehavior" name="TestService.Service"> 
    <endpoint binding="netTcpBinding" bindingConfiguration="myBinding" name="NetTcpService" contract="TestService.IService" /> 
    <endpoint address="mex" binding="mexTcpBinding" bindingConfiguration="" name="NetTcpMex" contract="IMetadataExchange"/> 
    <endpoint name="udpDiscoveryEpt" kind="udpDiscoveryEndpoint"/> 
    <host> 
     <baseAddresses> 
     <add baseAddress="net.tcp://[replace with ip address]:8080/Service" /> 
     </baseAddresses> 
    </host> 
    </service> 

主要點的服務器配置文件的服務標籤是終點,我們的服務標籤添加

<endpoint name="udpDiscoveryEpt" kind="udpDiscoveryEndpoint"/> 

而對於客戶端

static void Main(string[] args) 
    { 


     AnnouncementService announcementService = new AnnouncementService(); 

     announcementService.OnlineAnnouncementReceived += service_OnlineAnnouncementReceived; 

     announcementService.OfflineAnnouncementReceived += service_OfflineAnnouncementReceived; 

     using(var announcementServiceHost=new ServiceHost(announcementService)) 
     { 
      announcementServiceHost.AddServiceEndpoint(new UdpAnnouncementEndpoint()); 
      announcementServiceHost.Open(); 

      Console.WriteLine("Please enter to exit\n\n"); 
      Console.ReadLine(); 
     } 

    } 

    static void service_OfflineAnnouncementReceived(object sender, AnnouncementEventArgs e) 
    { 

     Console.WriteLine("Service Offline"); 
    } 

    static void service_OnlineAnnouncementReceived(object sender, AnnouncementEventArgs e) 
    { 
     Console.WriteLine("Service Online"); 
    } 

而且最重要的一點是

 using(var announcementServiceHost=new ServiceHost(announcementService)) 
     { 
      announcementServiceHost.AddServiceEndpoint(new UdpAnnouncementEndpoint()); 
      announcementServiceHost.Open(); 

      Console.WriteLine("Please enter to exit\n\n"); 
      Console.ReadLine(); 
     } 

這實際上開始監聽服務通告事件。

相關問題