Bezdepbonusu7Программирование: статьи и ответы

Вопрос

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

Автор вопроса: Peter MОтветов: 1

На этой неделе я пытался освоить 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. Установка правильного контекста красиво завершила решение.

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

wcfnamed-pipesnetnamedpipebinding

Ответы

Ответ 1 · рейтинг 2 · tomasr

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

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

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

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы