Может ли служба WCF создать свой собственный хост? - PullRequest
0 голосов
/ 15 мая 2009

У меня есть приложение типа клиент / сервер, и я хотел бы, чтобы объект сервера создал свой собственный хост. Это выглядит примерно так:

public class Server : IServer {
  private ServiceHost m_Host;
  public Server() {
    m_Host = new ServiceHost(this);
    m_Host.Open();
  }
}

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

Итак, возможно ли для объекта создать свой собственный хост? Или мне действительно нужно создать его в main () или сделать что-то еще?

РЕДАКТИРОВАТЬ: Я думаю, что проблема в этом случае заключается в том, что я хочу, чтобы объект, который реализует сам сервис, создал свой собственный ServiceHost.

Ответы [ 3 ]

0 голосов
/ 15 мая 2009

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

0 голосов
/ 15 мая 2009

Проверьте ServiceBehaviorAttribute , который позволяет вам указать, как ваша служба ... ведет себя. ;) Свойство ConcurrencyMode определяет поддержку многопоточности и по умолчанию - однопоточный режим, а InstanceContextMode определяет, является ли объект службы сеансом, вызовом или одиночным вызовом.

Цитата из ConcurrencyMode:

Если для параметра ConcurrencyMode задано значение Single, система ограничивает количество экземпляров службы одним потоком выполнения за раз, что освобождает вас от проблем с многопоточностью. Значение Multiple означает, что служебные объекты могут выполняться несколькими потоками одновременно. В этом случае вы должны обеспечить безопасность потока.

Цитата из InstanceContextMode:

Если для параметра InstanceContextMode задано значение Single, это означает, что ваша служба может обрабатывать только одно сообщение за раз, если вы не установите для параметра ConcurrencyMode значение Multiple.

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

0 голосов
/ 15 мая 2009

Ничто не мешает создать объект ServiceHost.

Тогда возникает большой вопрос - можете ли вы гарантировать, что ваш объект, содержащий хост службы, "жив"? Или это был какой-то случайный мусор?

Мы используем службы Windows (NT) для размещения собственных классов хостов пользовательских служб, чтобы обеспечить круглосуточную доступность служб WCF - все работает отлично

Марк

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...