Определить, когда клиент подключен к сервису wcf - PullRequest
0 голосов
/ 28 июня 2010

Из небольшого прочтения я понимаю, что единственный способ обнаружить, что клиент подключился к моей службе, - это написать собственный код. Я использую службу Singleton. Я хотел бы отображать сообщение каждый раз, когда клиент подключается к моей службе, которую подключил клиент x с ip xxx. Нет встроенного события, которое генерируется? Я прав?

Ответы [ 2 ]

0 голосов
/ 26 апреля 2012

Я фактически реализовал свои собственные сервисные методы connect, disconnect и ping, которые я вызываю вручную из своего клиента после создания канала. Используя их как своего рода раздел заголовка во всех моих определениях интерфейса ServiceContract (и, конечно, их реализациях), они образуют временное "определение базовой службы", которое требует лишь небольшого количества вырезки из нити.

Строковые параметры connect и disconnect будут использоваться для отправки информации о клиенте на сервер и возврата информации о сервере и (возможно, уникального идентификатора соединения) клиенту. Кроме того, набор контрольных точек синхронизации также может появиться.

Обратите внимание, как требуется SessionMode, а отдельные свойства OperationContract IsInitiating и IsTerminating явно указаны для каждого метода, конечным результатом является то, что я бы назвал «односессионным» сервисом, поскольку он определяет connect и disconnect в качестве отдельных выходных сессий.

Обратите также внимание, что команда ping будет использоваться в качестве цели для вызова «heartbeat» на основе таймера, который проверяет состояние подключения службы и устраняет таймауты подключения ALL без единого файла конфигурации: - )

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

   [ServiceContract( SessionMode = SessionMode.Required )]
   public interface IRePropDalSvr {
      [OperationContract( IsInitiating=true, IsTerminating=false )]
      string connect (string pClientInfo);

      [OperationContract( IsInitiating=false, IsTerminating=true, IsOneWay=true )]
      void disconnect (string pClientInfo);

      // ------------------------------------------------------------------------------------------
      [OperationContract( IsInitiating=false, IsTerminating=false )]
      string ping (string pInp);

      // ------------------------------------------------------------------------------------------
      // REST OF ServiceContract DEFINITION GOES HERE

Одно предостережение: хотя я в настоящее время использую этот код и его реализацию в своих классах обслуживания, я еще не проверял код.

0 голосов
/ 28 июня 2010

Нет, я не думаю, что в WCF есть какая-либо поддержка для вашего требования.

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

Класс ServiceHost может быть более подходящим кандидатом на эту функцию, но, опять же, его задача - разместить службу,ускорить время выполнения WCF и т. д. - и это действительно не компонент пользовательского интерфейса, либо.

Что вы могли бы сделать, так это

  • с интерфейсом администратора (Winforms, консоль или приложение WPF), работающим на вашем сервере вместе с вашим сервисом, предоставляя сервис администратора для вызова
  • определяет быстрое соединение между двумя сервисами (например, с помощью привязки netNamedPipe, которая идеально подходит для обмена сообщениями внутри приложения)
  • когда ваш «реальный» сервис получает вызов, первым делом онон отправляет сообщение в пользовательский интерфейс администратора, который затем может взять это сообщение и обработать его

Таким образом, вы можете четко разделить реальную службу и ее работу (для предоставления этой услуги) иПользовательский интерфейс администратора, который вы хотите сделать, и создать чисто разделенную систему.

...