Периодически повторно объявлять службу при использовании конечной точки объявления WCF ServiceDiscoveryBehavior?

У меня есть управляемая служба обнаружения, размещенная с известным URI. У меня есть обнаруживаемая служба, которая при запуске объявляет о себе, используя AnnouncementEndpoint, добавленную в ServiceDiscoveryBehavior службы.

Конкретный вариант использования, который я хотел бы решить, заключается в следующем:

  1. Запускается служба управляемого обнаружения.
  2. Обнаруживаемая служба запускается и сообщает о себе службе управляемого обнаружения.
  3. Служба управляемого обнаружения перезапускается (по разным причинам).

Как тогда обнаруживаемая служба обновляет себя (повторно объявляет) службе управляемого обнаружения?

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

Альтернативным вариантом использования может быть:

  1. Существующая обнаруживаемая служба запущена.
  2. Запущена новая служба управляемого обнаружения.

Как принудительно вызвать или вызвать тот же вызов контракта службы объявлений для новой службы управляемого обнаружения?

Я надеюсь, что это достаточно информации о том, чего я хочу достичь.


person Jim    schedule 31.05.2011    source источник


Ответы (1)


Я нашел ответ сам. В сценарии, где вам нужно управлять объявлениями вне ServiceDiscoveryBehavior , вы должны использовать ссылку AnnouncementClient.

AnnouncementClient client = new AnnouncementClient(announcementEndpoint);
var endpointDiscoveryMetadata = EndpointDiscoveryMetadata.FromServiceEndpoint(netTcpEndpoint);

client.AnnounceOnline(endpointDiscoveryMetadata);
person Jim    schedule 01.06.2011
comment
Как это работает? У меня есть следующее: Все обнаруживаемые службы сообщают о себе службе обнаружения при запуске. Но когда мне нужно перезапустить саму службу обнаружения, не перезапуская службы обнаружения, служба обнаружения больше не знает об обнаруженных службах, которые все еще работают. Итак, у меня есть идея кэшировать все эти объекты EndpointDiscoveryMetadata, и после перезапуска я хочу проверить, живы ли службы, стоящие за этими сохраненными EndpointDiscoveryMetadata. у вас есть идея, как это сделать? - person esskar; 20.12.2011
comment
@ esskar - Я реализовал периодическую задачу (поток), которая повторно объявляет через настраиваемый интервал. Затем в реализации службы обнаружения он добавит или обновит свой внутренний кэш. Если вы еще этого не сделали, я предлагаю создать собственную службу обнаружения из System.ServiceModel.Discovery.DiscoveryProxy и реализовать собственное кэширование конечных точек. См. msdn.microsoft.com/en-us/library/dd456787.aspx Кроме того, я реализовал аренду, которую каждый сервис предоставляет в виде расширений метаданных. Если срок аренды истекает, служба обнаружения удаляет конечную точку. - person Jim; 21.12.2011
comment
...Продолжение... Если служба оповещения продлевает аренду путем повторного объявления себя, служба обнаружения сохранит ее в памяти. Кроме того, вы можете запустить несколько служб обнаружения и взаимодействовать друг с другом с помощью одноранговой сети. Каждый узел сетки имеет общие конечные точки. Это позволяет вашим службам иметь избыточность, если одна служба обнаружения выйдет из строя. - person Jim; 21.12.2011