2014-10-03 85 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(); 
     } 

这实际上开始监听服务通告事件。