Именованный канал IPC WCF

На этой неделе я пытался освоить Named Pipes. Задача, которую я пытаюсь решить с их помощью, заключается в том, что у меня есть существующая служба Windows, которая действует как драйвер устройства, который перенаправляет данные с внешнего устройства в базу данных. Теперь мне нужно изменить эту службу и добавить дополнительный пользовательский интерфейс (на том же компьютере, используя форму IPC), который может отслеживать данные по мере их передачи между устройством и БД, а также отправлять некоторые команды обратно в службу. .

Моими первоначальными идеями для IPC были именованные каналы или файлы с отображением памяти. До сих пор я работал над идеей именованного канала, используя Учебник по основному взаимодействию WCF Общение. Моя идея состоит в том, чтобы настроить службу Windows с дополнительным потоком, который реализует службу WCF NamedPipe, и использовать его в качестве канала для внутренних компонентов моего драйвера.

У меня работает пример кода, однако я не могу разобраться в двух проблемах, с которыми я надеюсь, что кто-то здесь может мне помочь:

  1. В учебнике ServiceHost создается с помощью typeof (StringReverser), а не путем ссылки на конкретный класс. Таким образом, похоже, что у Сервера нет механизма для взаимодействия с самой службой (между строками host.Open () и host.Close ()). Можно ли создать связь и передавать информацию между сервером и классом, который фактически реализует службу? Если да, то как?

  2. Если я запускаю один экземпляр сервера, а затем запускаю несколько экземпляров клиентов, кажется, что каждый клиент получает отдельный экземпляр класса обслуживания. Я попытался добавить некоторую информацию о состоянии в класс, реализующий службу, и она сохранилась только в экземпляре именованного канала. Возможно, это связано с первым вопросом, но есть ли способ заставить именованные каналы использовать тот же экземпляр класса, который реализует службу?

  3. Наконец, есть какие-нибудь мысли о MMF и Named Pipes?

Изменить - О решении

Согласно ответу Томасра, решение заключается в использовании правильного конструктора для предоставления конкретного одноэлементного класса, реализующего службу (Конструктор ServiceHost (Object, Uri [])). Что мне тогда не понравилось, так это его ссылка на то, чтобы класс обслуживания был потокобезопасным. Простое изменение конструктора вызвало сбой на сервере, что в конечном итоге привело меня к пониманию InstanceContextMode из этой записи в блоге Instancecontextmode и Concurrencymode. Установка правильного контекста красиво завершила решение.


person Peter M    schedule 18.06.2010    source источник
comment
К вашему сведению, ссылка на блог Instance Context мертва.   -  person Petrus Theron    schedule 24.11.2010
comment
Что касается вопроса № 3, обратитесь к этому сообщению в блоге: techmikael.blogspot.com/2010/02/   -  person Omer Raviv    schedule 31.05.2011


Ответы (1)


Для (1) и (2) ответ прост: вы можете попросить WCF использовать одноэлементный экземпляр вашей службы для обработки всех запросов. В основном все, что вам нужно сделать, это использовать альтернативный конструктор ServiceHost, который принимает экземпляр объекта вместо типа.

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

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

person tomasr    schedule 18.06.2010
comment
ну, теперь, когда вы указали мне правильный конструктор, это был полный D'Oh! Спасибо. Что касается производительности, окончательная система действительно будет состоять только из одного клиента к одному серверу, но перемещать умеренный объем данных. Мне нравится идея именованного канала, поскольку я вижу, как настроить его для перемещения структурированного объекта, и мне кажется, что MMF менее структурирован. - person Peter M; 18.06.2010