我已经使用TCP绑定创建了本地WCF服务。当我的服务突然停止时,我想处理这个案子。我知道如何检查服务何时在客户端发生故障,但我不知道如何检查服务何时恢复在线。
简单来说,我希望我的客户端在服务重新启动时自动创建新的正确连接 在检查互联网后,我找到了WCF公告功能,但我没有找到关于如何使用公告功能的明确示例。
请注意,客户端连接对象(服务)是由Visually Studio通过输入服务引用而不是我自己创建的。
我的服务有一个静态IP地址,所有客户端都在本地网络上。
我的问题是,WCF公告是正确的选择,还是有其他解决方案?
答案 0 :(得分:0)
您可以通过两种方式来做您需要做的事情:
由于您的服务具有静态IP地址,因此您可以使用旧方法在客户端进行“检查是否在线”计时器事件,该事件在与服务的连接丢失时开始,并继续将目标戳到通过调用仅回复True/All-OK
的WCF服务上的特定方法,查看服务何时重新启动
这种方法的问题有很多:
因此,使用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();
}
实际上开始侦听服务公告事件。