Как уведомить хост службы WCF при подключении клиента? - PullRequest
2 голосов
/ 22 сентября 2011

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

private ServiceHost sHost;
WCF.WCFService wcfService = new WCF.WCFService();
sHost = new ServiceHost(wcfService);
sHost.Open();

Я могу вызывать методы в службе WCF с помощью службы Windows, используя объект wcfService. Есть ли какой-нибудь способ иметь какое-то событие, которое сработало бы, когда клиент подключается к службе WCF?

Ответы [ 2 ]

1 голос
/ 23 сентября 2011

Я нашел лучший ответ здесь: Подписаться на события в службе WCF

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

1 голос
/ 22 сентября 2011

Служба работает как объект, экземпляр которого создается в соответствии со свойством ServiceBehaviourAttribute InstanceContextMode

[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall)]
public class MyService : IMyService
{ 
    // ...

Значения InstanceContextMode:

  • Single - один экземпляр службы выполняется для всех сеансов и вызовов
  • PerSession - экземпляр службы выполняется для каждого сеанса (т. Е. Каждого клиента)
  • PerCall- экземпляр службы создается для каждого вызова, даже с одного клиента

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

// you don't need to specify PerSession as it is default, but I have for clarity
[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession)]
public class MyService : IMyService
{ 
    public MyService()
    {
        // constructor will be called for each new client session
        // eg fire an Event, log a new client has connected, etc
    }
    // ...
}

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

...