WCF宣布是正确的选择吗?

时间:2014-10-03 22:55:46

标签: c# web-services wcf

我已经使用TCP绑定创建了本地WCF服务。当我的服务突然停止时,我想处理这个案子。我知道如何检查服务何时在客户端发生故障,但我不知道如何检查服务何时恢复在线。

简单来说,我希望我的客户端在服务重新启动时自动创建新的正确连接 在检查互联网后,我找到了WCF公告功能,但我没有找到关于如何使用公告功能的明确示例。

请注意,客户端连接对象(服务)是由Visually Studio通过输入服务引用而不是我自己创建的。
我的服务有一个静态IP地址,所有客户端都在本地网络上。

我的问题是,WCF公告是正确的选择,还是有其他解决方案?

2 个答案:

答案 0 :(得分:0)

您可以通过两种方式来做您需要做的事情:

由于您的服务具有静态IP地址,因此您可以使用旧方法在客户端进行“检查是否在线”计时器事件,该事件在与服务的连接丢失时开始,并继续将目标戳到通过调用仅回复True/All-OK的WCF服务上的特定方法,查看服务何时重新启动 这种方法的问题有很多:

  • 您需要有一种方法来更改每个客户端配置的IP地址,这可能会造成维护噩梦。
  • 如果您有许多客户端应用程序每隔几秒轮询一次,以查看它是否再次启动,您可能会严重打击您的服务。
  • 如果服务再次可用,您将有延迟,最长可达轮询间隔的持续时间。

因此,使用WCF Discovery方法会更好,因为您的客户端将等待服务再次返回联机状态,宣布它已准备就绪,并且不会使用不需要的流量来拥塞本地网络。 在以下站点上,有关于如何使用WCF发现功能的示例和说明:

希望所有这些页面都以您的语言提供。

答案 1 :(得分: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();
        }

实际上开始侦听服务公告事件。