
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[216.73.216.30] |
![]() |
|
Сообщ.
#1
,
|
|
|
У меня будет слюжба (сервис) и приложение, которое должно служить интерфейсом этой службы. Служба в частности обращается к базе данных. Вопрос. Какие сейчас есть современные средства обмена данными между службой и приложением НА ОДНОМ КОМПЕ? Раньше я тупо использовал сокет на 127.0.0.1 для обмена. Может что поинтереснее есть? И чтобы данные легко было передавать и менять.
|
Сообщ.
#2
,
|
|
|
Средства сейчас остались теме же... Если очень уж хочется извратиться -- можешь Remouting поюзать...
|
![]() |
Сообщ.
#3
,
|
|
Цитата Jupiter @ Может что поинтереснее есть? 1. System.Runtime.Remoting 2. Windows Communication Foundation Цитата _hunter @ - почему извратиться? Отличное средство межпроцессного взаимодействия, + получаешь масштабируемость. Если очень уж хочется извратиться |
Сообщ.
#4
,
|
|
|
COM, Web Service, named pipe, File.Write + FileSystemWatcher, MSMQ...
|
Сообщ.
#5
,
|
|
|
Цитата J0ker @ COM, Web Service, named pipe, File.Write + FileSystemWatcher, MSMQ... Но счет named pipe. Это ведь технология, основанная на WinAPI... Есть ли в .NET свежая оболочка для этой идеи? |
Сообщ.
#6
,
|
|
|
Встречный вопрос, а чем не подходит Remoting?
|
Сообщ.
#7
,
|
|
|
Я не говорил, что он мне не подходит. Более того, скорее всего я на нем-то и остановлюсь. Но мне интересно про named pipes.
|
Сообщ.
#8
,
|
|
|
Цитата Jupiter @ named pipes. кстати новая штука в .NET в 2.0 точно не было. А если Remoting то там есть прикольный протокол как раз для локальной машины - IPC |
![]() |
Сообщ.
#9
,
|
|
Цитата Jupiter @ - если юзаешь 3.0, то для WCF если мне не изменяет память - один из видов байндинга Но мне интересно про named pipes. |
![]() |
Сообщ.
#10
,
|
|
Цитата juice @ Было зато в windows 3.1, так что условно новая кстати новая штука в .NET в 2.0 точно не было. |
Сообщ.
#11
,
|
|
|
Цитата ANDLL @ Было зато в windows 3.1 То что именнованые каналы были я знаю, даже в Жабе была их поддержка, а я как раз про .NET. Я думаю их ввели в связи с добавлением библиотек по созданию аддинов. Они активно юзают их в своей реализации обеспечивая взаимодействия между доменом хоста и доменами куда загружаются плагины. |
Сообщ.
#12
,
|
|
|
Понимаю, что глупый вопрос, но все же... Вот я делаю ремоутинг, как советовал juice на канале IPC. Во всех примерах фигурируют три проекта: кроме клиента и сервера еще и сам класс, который будет создаваться удаленно. Где-то даже делают это не класс, а интерфейс. Мне не надо, чтобы была отдельная DLL для реализации класса. Хорошо, пусть это будет не класс, а интерфайс - какой-нибудь ICallableObject. Ну и где мне его описывать? Я делал в принципе как - описывал интерфайс одинаково дважды: в проекте сервера и в проекте клиента. И оно работало. Но не буду же я так делать всегда, хочется один раз его описать. То есть должен ли я описать интерфейс в одтельном файле .cs и включить этот файл в оба проетка, или держать описание интерфейса, скажем, в проете сервера, а в проекте клиента сделать референс?
|
Сообщ.
#13
,
|
|
|
Цитата Jupiter @ Ну и где мне его описывать? Создается отдельный проект Сlass Library с твоим интерфейссом. Ты ссылаешься на него в проекте сервера (реализуешь интерфейс) и цепляешь его к клиенту, что бы иметь возможность обращаться к серверу. Иметь его как сs в проекте сервера не разумно, клиенту не нужна сборка с реализацией сервера. + к этому там где сборка с интерфейссом, можно объявлять собственные типы, которые могут пересекать границы домена между клиентом и сервером. |
Сообщ.
#14
,
|
|
|
Цитата juice @ Создается отдельный проект Сlass Library с твоим интерфейссом ... + к этому там ... можно объявлять собственные типы, которые могут пересекать границы домена между клиентом и сервером. И этот проект все-таки будет компилироваться в DLL? (извиняюсь за глупые вопросы, но я новичок в .net) |
![]() |
Сообщ.
#15
,
|
|
Цитата Jupiter @ этот проект все-таки будет компилироваться в DLL? - да |
Сообщ.
#16
,
|
|
|
Помучаю вас еще. Вот я сделал ремоутинг. Мой ipc-сервер реализован в службе Windows, клиент - обычное приложение (ехе-шник). Проблема в том, что все работает только когда служба-сервер запущена под пользовательской учетной записью (той же, под которой я рабтаю и запускаю клиентский ехе-шник). Стоит мне перевести службу под уч. запись Local Service (а именно так у меня и должно быть), в клиенте возникает исключение:
"Не удалось подключиться к IPC-порту: Отказано в доступе" Вопрос: где задаются права на использование канала? Спасибо. |
![]() |
Сообщ.
#17
,
|
|
Сделай Local System
|
Сообщ.
#18
,
|
|
|
Цитата PIL @ Сделай Local System Все равно отказано в доступе |
![]() |
Сообщ.
#19
,
|
|
Перечислено,всё, что можно кроме стандартного МС подхода. Использовать надо нетовский ServiceController класс. и ,v частости, его метод OnCustomCommand.
|
Сообщ.
#20
,
|
|
|
Цитата MIF @ Использовать надо нетовский ServiceController класс Спасибо. Я попробовал этот класс. Но к сожалению он больше подходит для запуска и останова служб. Плользовательское действие там предусмотрено, но это чрезвычайно скудный механизм. Ремоутинг рулит. И вот еще что я заметил: ServiceController.CanStop выдает честно может или нет служба быть остановлена, но остановить ее не удается: метод ServiceController.Stop() дает все то же исключение: отказ доступа. Я пробовал не только мою службу, но и другие, которые там были. Результат один. То есть и ремоутинг и ServiceController не имеют доступа. При этом ServiceController не может остановить/запустить службы НЕЗАВИСИМО от того, под какой уч. записью они работают, в то время как ремоутинг по крайней мере пашет при совпадении уч. записи службы и клиетна. Задача остается прежней: наладить взаимодействие по ремоутингу (ipc) в случае когда служба запускается не под пользовательской уч. зап. Кстати, забыл сказать, что пишу под Вистой. Может это важно... |
Сообщ.
#21
,
|
|
|
Цитата PIL @ - если юзаешь 3.0, то для WCF если мне не изменяет память - один из видов байндинга и я что-то такое припоминаю. Цитата Jupiter @ Помучаю вас еще. Твои вопросы как бальзам на душу, жаль что помочь не могу. Самому интересно - поборол таки проблему? |
Сообщ.
#22
,
|
|
|
Я пишу под Вистой. На сегодня я реализовал в своей системе два рекомендованных мне здесь механизма:
1. IPC-remoting для обмена данными между Службой и Приложением; 2. ServiceController для запуска и останова Службы из Приложения. Оба механизма капризничают относительно прав доступа: 1. IPC-remoting работает только если Служба запущена под той же учетной записью, под которой работает Приложение; 2. ServiceController работает только если Приложение запущено "от имени администратора". Вопросы: 1. Как настроить права Remoting, чтобы объяснить Службе, что ей нечего бояться и можно давать всем? 2. Как сделать так, чтобы при запуске Приложения не от имени администратора при попытке остановить/запустить Службу полозователю, как это принято в Висте, выдавалось бы предупреждение UAC, а не сразу отлуп? |
Сообщ.
#23
,
|
|
|
Цитата 1. Как настроить права Remoting, чтобы объяснить Службе, что ей нечего бояться и можно давать всем? Возможно мало прав при открытие точки, тогда нужно указать: BinaryServerFormatterSinkProvider.TypeFilterLevel = TypeFilterLevel.Full; // полагаю, что у вас бинарный провайдер для IPC Умные дяди скажут как это через app.config это сделать ![]() |
Сообщ.
#24
,
|
|
|
Цитата BinaryServerFormatterSinkProvider.TypeFilterLevel = TypeFilterLevel.Full; Я сделал так. Теперь у меня вместо простенького ![]() ![]() configChannel = new IpcChannel("ConfigCommunicationIpcChannel"); стало вот такое: ![]() ![]() BinaryServerFormatterSinkProvider provider = new BinaryServerFormatterSinkProvider(); provider.TypeFilterLevel = System.Runtime.Serialization.Formatters.TypeFilterLevel.Full; System.Collections.Hashtable props = new System.Collections.Hashtable(); props["portName"] = "ConfigCommunicationIpcChannel"; configChannel = new IpcChannel(props, null, provider); Потенциальных возможностей больше, но работает по-прежнему только под пользовательской уч. зап. ![]() |
Сообщ.
#25
,
|
|
|
Помогите, плиз! У меня возникла точно такая же проблема. как ее решить?????
![]() |
Сообщ.
#26
,
|
|
|
Я хотел бы сообщить, как решились мои вопросы.
1. Для запуска и останова службы , работающей под уч записью Local Service, средствами ServiceController я применяю подход, описанный в http://vstslive.wordpress.com/ А именно, в манифесте нужно прописать: <requestedExecutionLevel level=”requireAdministrator” uiAccess=”false” /> В этом случае при старте программы выдается окно подтверждения на запуск от имени администратора. Конечно, лучще было бы выдавать запрос не при старте программы, а непосредственно перед выполнением действия по старту/остановке службы. Но это уже и так огромный прогресс. 2. Проблемы с Remouting решились после отказа от Remouting в пользу кошачей технологии (с неудобопроизносимым названием CWF). |