Как я могу проверить, что хост WCF доступен, прежде чем использовать канал от клиента?

StackOverflow https://stackoverflow.com/questions/1078037

Вопрос

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

В настоящее время у меня возникла ситуация, когда главный процесс вызывает подчиненное устройство через именованный канал до того, как подчиненное устройство полностью запустится и начнет прослушивать именованный канал.

    ProcessStartInfo processStartInfo = new ProcessStartInfo("slave");
    processStartInfo.Arguments = Address 

    Process process = new Process();
    process.StartInfo = processStartInfo;

    process.Start();

    base.Endpoint.Binding = new NetNamedPipeBinding(NetNamedPipeSecurityMode.None);
    base.Endpoint.Address = Address;

    base.Channel.RemoteMethod();

Если я это сделаю, канал попадет в CommunicationState.Faulted и любые последующие вызовы на канале также завершаются неудачно.

Что я могу сделать, чтобы проверить от ведущего устройства, что ведомый процесс начинает прослушивать?Или как мне оправиться от CommunicationState.Faulted повторить мой удаленный вызов?

Это было полезно?

Решение

Единственный способ выйти из состояния Faulted — повторно инициализировать клиент WCF, пересобрав экземпляр и вызвав метод Open().

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

Другие советы

Вы можете подключиться к событию «ServiceFaulted» на хосте и использовать его для обработки ошибок.Согласно документации, правильное действие — прервать работу хоста.Затем вы можете попытаться повторно инициализировать его, но это может оказаться бесполезным занятием, если система не работает.

Возможно, вы могли бы реализовать службу на основе «сессии».Таким образом, клиент открывает канал WCF и вызывает открытие сеанса (например.«открытый» звонок).Это позволит вашему хосту узнать, что подчиненное устройство слушает.

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

Алекс Дреня прав, говоря, что вы хотите создать новый экземпляр.Я бы порекомендовал взглянуть на класс ChannelFactory в WCF для создания прокси.Вы можете использовать это с некоторым поведением типа try catch, чтобы справиться с начальным запуском вашего подчиненного устройства.Вы также можете поместить System.Diagnostics.Debugger.Break() в код запуска подчиненного процесса, поскольку отладчик может не подключиться, поэтому вы не увидите исключение в своем подчиненном процессе.

Могу ли я спросить, действительно ли вам нужна изоляция процессов или для вашей задачи будет достаточно использования синхронизации и потоков?

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top