Я создал локальную службу WCF с привязкой TCP. Я хотел бы рассмотреть случай, когда мой сервис внезапно опустится. Я знаю, как проверить, когда служба идет на стороне клиента, но я не знаю, как проверить, когда служба возвращается в онлайн.
Проще говоря, я хочу, чтобы моя клиентская сторона автоматически создавала новое правильное соединение, когда служба перезагружается.
После проверки в Интернете я нашел функцию объявления WCF, но я не нашел ясного примера того, как использовать функцию анонса.
Обратите внимание, что объект подключения клиента (служба) создается автоматически визуально Studio, введя ссылку на службу, а не я.
Моя служба имеет статический IP-адрес, и все клиенты будут находиться в локальной сети.
Мой вопрос в том, что объявление WCF является правильным выбором или есть ли другое решение?
Чтобы сделать работу с анонсом, стороне сервера необходимо добавить для добавления тега в поведение службы файла конфигурации на стороне сервера, например, этого
<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();
}
которые фактически начинают прослушивать событие объявления услуги.
Есть два способа, которыми вы можете заняться, чтобы сделать то, что вам нужно сделать:
Поскольку у вас есть статический IP-адрес для вашей службы, вы можете использовать старый метод включения события таймера "Проверить, если онлайн" на вашей стороне клиента, который начинается, когда соединение с услугой теряется, и продолжает совать адресат, чтобы увидеть, когда служба возвращается снова, вызывая конкретный метод в вашей службе WCF, который только что отвечает True/All-OK
. Проблемы с таким подходом много:
Поэтому использование метода обнаружения WCF будет лучше, потому что тогда ваши клиенты будут ждать, пока служба снова вернется в сеть, сообщите, что она готова и не поддерживает локальную сеть с ненужным трафиком. На следующих сайтах приведены примеры и объяснения того, как использовать функцию обнаружения WCF:
Надеемся, что все эти страницы доступны на вашем языке.