Является ли объявление WCF правильным выбором?

1

Я создал локальную службу WCF с привязкой TCP. Я хотел бы рассмотреть случай, когда мой сервис внезапно опустится. Я знаю, как проверить, когда служба идет на стороне клиента, но я не знаю, как проверить, когда служба возвращается в онлайн.

Проще говоря, я хочу, чтобы моя клиентская сторона автоматически создавала новое правильное соединение, когда служба перезагружается.
После проверки в Интернете я нашел функцию объявления WCF, но я не нашел ясного примера того, как использовать функцию анонса.

Обратите внимание, что объект подключения клиента (служба) создается автоматически визуально Studio, введя ссылку на службу, а не я.
Моя служба имеет статический IP-адрес, и все клиенты будут находиться в локальной сети.

Мой вопрос в том, что объявление WCF является правильным выбором или есть ли другое решение?

  • 0
    Как насчет добавления контракта операции Healthcheck в службу wcf и проверки связи с клиентом
Теги:
web-services
wcf

2 ответа

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();
        }

которые фактически начинают прослушивать событие объявления услуги.

0

Есть два способа, которыми вы можете заняться, чтобы сделать то, что вам нужно сделать:

Поскольку у вас есть статический IP-адрес для вашей службы, вы можете использовать старый метод включения события таймера "Проверить, если онлайн" на вашей стороне клиента, который начинается, когда соединение с услугой теряется, и продолжает совать адресат, чтобы увидеть, когда служба возвращается снова, вызывая конкретный метод в вашей службе WCF, который только что отвечает True/All-OK. Проблемы с таким подходом много:

  • Вы должны иметь способ изменения IP-адреса в каждой конфигурации клиента, который может создать кошмар обслуживания.
  • Вы потенциально можете поразить свою службу, если у вас есть много клиентских приложений, опросив их каждые пару секунд, чтобы узнать, снова ли это.
  • У вас будет отсрочка, когда услуга будет доступна снова, максимальная продолжительность вашего опроса.

Поэтому использование метода обнаружения WCF будет лучше, потому что тогда ваши клиенты будут ждать, пока служба снова вернется в сеть, сообщите, что она готова и не поддерживает локальную сеть с ненужным трафиком. На следующих сайтах приведены примеры и объяснения того, как использовать функцию обнаружения WCF:

Надеемся, что все эти страницы доступны на вашем языке.

  • 0
    Я пытаюсь перейти по следующей ссылке : я добавил <serviceDiscovery /> в <serviceBehaviors />, а также добавляю конечную точку обнаружения в конфигурации сервера. После этого я создаю AnnounceService на стороне клиента и подписываю событие, но событие не срабатывает не только когда служба подключена к сети, но и когда она была отключена. Любая помощь приветствуется.
  • 0
    Я не знаю, поможет ли это, но вот мой метод тестирования. Перед производством служба создается в типе проекта «Приложение-служба WCF» и еще не размещается ни IIS, ни каким-либо другим способом. Сначала я пытаюсь запустить клиентское приложение, затем пытаюсь запустить свой сервис. Событие «OnlineAnnouncementReceived» не запускается. Затем я пытаюсь принудительно закрыть свой сервис. Событие «OfflineAnnouncementReceived» не запускается. Служба объявлений WCF работает даже в случай, когда служба не закрыта должным образом, например, отключение питания или внезапная проблема с сетью, т.е. не закрывается должным образом?

Ещё вопросы

Сообщество Overcoder
Наверх
Меню