Здравствуйте, Мартыненко Сергей, Вы писали:
МС>Добрый день!
МС>подскажите пожалуйста, есть ли возможность в каком либо Sink на стороне сервера получить имя класса и имя метода (свойства) к которому происходит обращение. На данный момент используется TCPChannel, BinaryServerFormatterSinkProvider и свой Sink который применяется до BinaryServerFormatterSinkProvider.
подскажите пожалуйста, есть ли возможность в каком либо Sink на стороне сервера получить имя класса и имя метода (свойства) к которому происходит обращение. На данный момент используется TCPChannel, BinaryServerFormatterSinkProvider и свой Sink который применяется до BinaryServerFormatterSinkProvider.
МС>подскажите пожалуйста, есть ли возможность в каком либо Sink на стороне сервера получить имя класса и имя метода (свойства) к которому происходит обращение.
Конечно. Если почему-то не получается в канальном Sink это сделать, то можно сделать в контекстном Sink. Главное — получить распакованный IMessage, в нем — все есть.
Здравствуйте, Igor Trofimov, Вы писали:
iT>Конечно. Если почему-то не получается в канальном Sink это сделать, то можно сделать в контекстном Sink. Главное — получить распакованный IMessage, в нем — все есть.
Вы не могли бы подсказать как можно получить Message, Я смотрел в отладчике, но в метод ProcessMeesage приходит null. Возможно я что то не так сделал. У меня есть Sink в котором реализовал простейшую авторизацию подключаемого пользователя. Но теперь возникла необходимость давать или нет доступ (в зависимости от полномочий пользователя) к определенным методам. так вот в методе ProcessMessage моего Sink параметр requestMessage равен null. Sink наследуетс следующие класы и интерфейсы BaseChannelObjectWithProperties, IServerChannelSink и получает управление до BinaryServerFormatterSinkProvider
Я так понял, вы определили канальный приемник, который работает до серверного форматировщика (FormatterSink).
Его задача — преобразовывать поток байт в граф объектов (IMessage).
Так что не удивительно, что готового IMessage у вас в вашем приемнике (sink) еще нету.
Или переопределите серверный форматировщик и найдите способ обратиться к стандартному форматировщику, а затем обработать полученный IMessage, или вставляйте свой приемник ПОСЛЕ стандартного форматировщика, когда IMessage уже сформирован. Это, например, серверный контекстный приемник.
Более того, это даже правильнее концептуально, потому что каналы у вас могут быть разными (TCP, UDP, что-то еще), а авторизация нужна по-любому. Логично вынести этот сервиcный слой из канала в контекст сервера.
Ну, правда, придется тогда ваши серверные объекты делать CBO. Впрочем, это не так страшно, зато очень полезно
Здравствуйте, Igor Trofimov, Вы писали:
iT>Я так понял, вы определили канальный приемник, который работает до серверного форматировщика (FormatterSink). iT>Его задача — преобразовывать поток байт в граф объектов (IMessage). iT>Так что не удивительно, что готового IMessage у вас в вашем приемнике (sink) еще нету. iT>Или переопределите серверный форматировщик и найдите способ обратиться к стандартному форматировщику, а затем обработать полученный IMessage, или вставляйте свой приемник ПОСЛЕ стандартного форматировщика, когда IMessage уже сформирован. Это, например, серверный контекстный приемник.
iT>Более того, это даже правильнее концептуально, потому что каналы у вас могут быть разными (TCP, UDP, что-то еще), а авторизация нужна по-любому. Логично вынести этот сервиcный слой из канала в контекст сервера. iT>Ну, правда, придется тогда ваши серверные объекты делать CBO. Впрочем, это не так страшно, зато очень полезно
Спасибо вроде то что нужно. Но тут у меня возник вопрос, в книжке (Microsoft NET Remoting) описан только один метод подключения IMessageSink — через атрибуты, а есть ли другой способ (в ручную так сказать) или как можно получить доступ к установленным MessageSink?
МС>Спасибо вроде то что нужно. Но тут у меня возник вопрос, в книжке (Microsoft NET Remoting) описан только один метод подключения IMessageSink — через атрибуты, а есть ли другой способ (в ручную так сказать) или как можно получить доступ к установленным MessageSink?
Смотря к каким и куда
Канальные синки через конфиг ставятся.
Синки для контекста можно задать через свойства контекста программно, при создании контекста.
Динамические приемники вообще в любой момент добавляются/убираются, но они меньше возможностей дают.
Здравствуйте, Igor Trofimov, Вы писали:
iT>Смотря к каким и куда iT>Канальные синки через конфиг ставятся. iT>Синки для контекста можно задать через свойства контекста программно, при создании контекста. iT>Динамические приемники вообще в любой момент добавляются/убираются, но они меньше возможностей дают.
Канальные синки я создавал следующим образом
BinaryServerFormatterSinkProvider provider = new BinaryServerFormatterSinkProvider();
TcpServerChannel channel = new TcpServerChannel(title, port, provider);
ChannelServices.RegisterChannel(channel, false);
интересует есть ли подобный механизм для MessageSink и если есть то где его можно найти