Как определить, запущена ли служба WCF, размещенная в консольном приложении? - PullRequest
0 голосов
/ 10 февраля 2012

У меня есть служба WCF, которая размещается в консольном приложении. Клиент подключается к Сервису через именованный канал. И консоль запускается только тогда, когда это нужно клиенту, а консоль убивается после того, как клиент завершен.

Вот код, который запускает и вызывает службу:

Process hostProcess = Process.Start(info);

//make sure the service is up and running
//todo: find out a better way to check if the service is up and running.
Thread.Sleep(200);

EndpointAddress endpointAddress = new EndpointAddress("net.pipe://localhost/test");
NetNamedPipeBinding binding = new NetNamedPipeBinding();
IHostedService service=hannelFactory<IHostedService>.CreateChannel(binding, endpointAddress);
service.Run();

hostProcess.Kill();

Я использую Thread.Sleep, чтобы убедиться, что служба запущена и работает, но это определенно неправильный подход.

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

ответ на следующий вопрос, как мне ждать, пока событие не будет запущено, без использования Thread.Sleep?

        private static EventWaitHandle GetEventWaitHandle()
    {
        try
        {
            EventWaitHandle eventWaitHandle = EventWaitHandle.OpenExisting(string.Format(serviceStartedEventName, taskIndex));
            return eventWaitHandle;
        }
        catch (Exception)
        {
            //if we do not sleep here, it may cause a stack over flow exceptoin.
            Thread.Sleep(10);
            return GetEventWaitHandle();
        }
    }

1 Ответ

2 голосов
/ 10 февраля 2012

Вы можете заставить консольное приложение сигнализировать событие , когда его ServiceHost был открыт.


ОБНОВЛЕНИЕ

Ваш стартовый код должен вызывать WaitOne дляЭкземпляр вашего WaitHandle:

EventWaitHandle evtServiceStarted = new EventWaitHandle(...);

Process hostProcess = Process.Start(info); 

//make sure the service is up and running
evtServiceStarted.WaitOne();

// Go ahead and call your service...

Ваш хост службы должен вызвать Set для экземпляра WaitHandle, указывающего на объект события с тем же именем:

EventWaitHandle eventWaitHandle = EventWaitHandle.OpenExisting(...);
// Set up the service host and call Open() on it

//... when its all done
eventWaitHandle.Set();

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

...