Рекомендации службы WCF для поддержания моих служб в рабочем состоянии

У меня есть несколько служб WCF в моем приложении WPF, я открываю их с помощью этого метода:

private void StartSpecificWCFService(IService service, string url, Type serviceInterfaceType)
{
    ServiceHost serviceHost = new ServiceHost(service, address);
    serviceHost.AddServiceEndpoint(serviceInterfaceType, new NetNamedPipeBinding(), url);
    serviceHost.Open();
    //sign to serviceHost.Faulted ??
    _wcfServicesHolder.Add(serviceHost); //A dictionary containing all my services
}

атрибуты услуг:

[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single, ConcurrencyMode = ConcurrencyMode.Multiple)]

Службы - это служба регистрации и служба событий, они получают много вызовов от других процессов. Я использую namedpipes, поскольку он самый быстрый, и процессы выполняются на ОДНОМ и том же компьютере.

Мой вопрос: как я могу поддерживать эти службы, чтобы они всегда были в рабочем состоянии?

  1. Таймер опроса, который повторяет _wcfServicesHolder и проверяет, открыта ли служба
  2. подпишитесь на событие serviceHost.Faulted.

И после того, как служба находится в состоянии сбоя, нужно ли повторно создавать клиента (в другом процессе)? или он все еще может передавать сообщения на том же канале?

Исключение, которое я получаю:

There was no endpoint listening at net.pipe://localhost/LoggingService that could accept the message. This is often caused by an incorrect address or SOAP action. See InnerException, if present, for more details

person ilansch    schedule 23.05.2013    source источник
comment
Разместите их в IIS (или в службе Windows), а не в приложении WPF.   -  person zimdanen    schedule 23.05.2013
comment
Ваше приложение WPF работает все время? Ваши ServiceHosts умирают или проблема в том, что они еще не созданы, когда вызывается служба?   -  person GTG    schedule 23.05.2013
comment
Они создаются и открываются при запуске приложения WPF, приложение WPF работает постоянно.   -  person ilansch    schedule 23.05.2013
comment
@zimdanen Я не могу размещать службы в службе IIS/Windows. вот как была спроектирована архитектура .. не банкомат   -  person ilansch    schedule 23.05.2013
comment
Вы можете размещать свои службы отдельно в ОС Windows .... но с IIS они также должны быть всегда активны .... Не было прослушивания конечной точки на ... эта ошибка также может возникнуть, если произошла какая-то ошибка при инициализации вашей службы и ваши службы не были загружены... напишите код регистрации вокруг своего фрагмента ServiceHost, чтобы выяснить это..   -  person SutharMonil    schedule 24.05.2013
comment
@SutharMonil, спасибо за ответ, службы были загружены должным образом, они перестают работать через некоторое время, вероятно, из-за того, что выбрасывается исключение и не ловится на стороне службы ..   -  person ilansch    schedule 25.05.2013


Ответы (2)


Почему службы имеют InstanceContextMode = InstanceContextMode.Single с одновременным доступом к потоку? Сохраняют ли службы какое-либо состояние потокобезопасности в памяти? Если нет, возможно, стоит попытаться реорганизовать сервисы для использования InstanceContextMode.PerCall. Это должен быть ваш предпочтительный выбор по умолчанию при настройке служб WCF. WCF — это прежде всего технология для реализации архитектуры, ориентированной на службы, и использование режима, отличного от PerCall, нарушает принцип безгражданства Принципы проектирования SO.

В поддержку этого, если у вас есть ошибка на стороне сервера с InstanceContextMode.Single, это означает, что что-то серьезно пошло не так в службе. Любое состояние, которое вы поддерживали в службе, будет потеряно — клиенты не могут просто повторно подключиться и возобновить работу в обычном режиме.

Какой бы InstanceContextMode вы ни использовали, ваш канал выйдет из строя, если он останется открытым, и к нему не будут подключаться клиенты в течение определенного периода времени. По TCP (или любому протоколу, который явно предоставляет надежный сеанс) вы можете указать тайм-аут бездействия для надежного сеанса, но у вас нет такой опции с использованием каналов.

С каналами, оставляя канал открытым дольше настроенного тайм-аута, канал выйдет из строя и станет бесполезным. Вы можете подписаться на событие сбоя канала и воссоздать прокси-сервер, если вы заинтересованы в том, чтобы канал оставался открытым для службы на протяжении всего времени существования вашего приложения. Как вы предлагаете, другой вариант - продолжать опрос по каналу, чтобы он оставался в живых.

person Lawrence    schedule 24.05.2013
comment
Будет ли служба быстрее реагировать на входящие запросы, если ей не придется запускать новый экземпляр для каждого вызова? - person crush; 11.08.2014

Чтобы поддерживать хост службы в рабочем состоянии, выберите вариант № 2 (подпишитесь на событие с ошибкой на хосте службы). В случае сбоя вам необходимо прервать хост-службу, создать новый экземпляр, перемонтировать обработчик сбойного события и открыть хост-службу.

Официальной документации по этому сценарию не так много, но вот старая запись из блога msdn, описывающая то, что вы ищете.

http://blogs.msdn.com/b/drnick/archive/2007/01/16/restarting-a-failed-service.aspx

Что касается клиента, то ему также потребуется воссоздать свой канал к серверу, когда указанный канал выйдет из строя.

person Kenneth Ito    schedule 24.05.2013