2009-05-15 3 views
0

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

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

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

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

EDIT: Я думаю, что проблема в этом случае заключается в том, что я хочу, чтобы объект, который реализует сервис, создает свой собственный ServiceHost.

ответ

0

Нет ничего, что могло бы остановить какой-либо объект для создания экземпляра ServiceHost.

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

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

Марк

+0

Я думаю, что проблема в моем случае заключается в том, что это не * любой * объект, который создает ServiceHost, это объект, который реализует саму службу. Я отредактирую свой вопрос, чтобы сделать его более ясным ... –

+0

А, ок - ну, это не похоже на плохую идею ИМХО. Вы * можете * создать экземпляр хоста службы в любом объекте, но я действительно не буду использовать объект реализации службы сам по себе - звучит как действительно плохая идея ..... (ServiceHost размещает Сервис внутри самого класса Service. .... даже думать об этом, похоже, рекурсивно и опасно ....) –

0

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

0

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

Цитата ConcurrencyMode:

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

Цитата InstanceContextMode:

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

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

Смежные вопросы