Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / WCF, Web Services, Remoting |
![]() ![]() |
Топик располагается на нескольких страницах: 1 2 [все] |
Nechto Member Откуда: Сообщений: 813 |
Добрый день! Уважаемые гуру, подскажите пожалуйста, правильно ли я оцениваю возможности Wcf в области обмена данными сервис-клиент. Сервис возвращает клиенту, тип object содержащий ссылку на класс: [DataContract] // интерфейс IRouter находится в общедоступной библиотеке для сервиса и клиента public class A : IRouter; public class C : IRouter; ... public class X : IRouter; public class DataRouter { [DataMember] public string TypeName {get; set;} [DataMember] public object Router {get; set;} // или так public IRouter Router {get; set;} } public class Service : IService { public DataRouter GetRouter() { return new DataRouter {TypeName = 'Custom class', new A()} //A - ссылка на класс } } Просто я пришел к такому выводу, что нельзя. По ряду причин: 1. Формат обмена данными происходит в XML 2. Ссылка на класс создаётся в куче сервера, и как её передать клиенту не могу себе представить Вот и решил спросить у аудитории. |
11 фев 19, 13:44 [21806364] Ответить | Цитировать Сообщить модератору |
Shocker.Pro Member Откуда: ->|<- :адуктО Сообщений: 21072 |
Естественно, ты не можешь передать объект из домена в домен, не выполняя сериализацию. |
||
11 фев 19, 13:50 [21806376] Ответить | Цитировать Сообщить модератору |
Nechto Member Откуда: Сообщений: 813 |
Shocker.Pro, Оно?
Все равно не могу понять. Ведь все равно нужно передать класс целиком (со всеми свойствами, методами, наследованиями, using-ми и др.). Разве можно это сделать в формате XML? |
|
11 фев 19, 14:00 [21806393] Ответить | Цитировать Сообщить модератору |
Petro123 Member Откуда: Загрузочный сектор Москвы (AutoPOI.ru) Сообщений: 38643 |
Nechto, Убери интерфейсы и не говори слово ссылка. Просто передай класс. Всё |
11 фев 19, 14:03 [21806399] Ответить | Цитировать Сообщить модератору |
Petro123 Member Откуда: Загрузочный сектор Москвы (AutoPOI.ru) Сообщений: 38643 |
|
||
11 фев 19, 14:04 [21806402] Ответить | Цитировать Сообщить модератору |
Petro123 Member Откуда: Загрузочный сектор Москвы (AutoPOI.ru) Сообщений: 38643 |
|
||
11 фев 19, 14:05 [21806404] Ответить | Цитировать Сообщить модератору |
Nechto Member Откуда: Сообщений: 813 |
Такой способ передачи работает успешно, я проверял. Мне то нужно понять можно ли передать класс при помощи базового типа object или наследованием IRouter. Хотя наследование IRouter выполняется в любом случае. |
||
11 фев 19, 14:11 [21806412] Ответить | Цитировать Сообщить модератору |
Shocker.Pro Member Откуда: ->|<- :адуктО Сообщений: 21072 |
Задача неясна. |
||
11 фев 19, 14:17 [21806423] Ответить | Цитировать Сообщить модератору |
Petro123 Member Откуда: Загрузочный сектор Москвы (AutoPOI.ru) Сообщений: 38643 |
ОК
Можно ли сделать сложнее?)))) Мне трудно отвечать на такой вопрос. Он не имеет цели. |
||||
11 фев 19, 14:19 [21806427] Ответить | Цитировать Сообщить модератору |
Nechto Member Откуда: Сообщений: 813 |
Подождите, попробую кратно разъяснить задачу! |
||||
11 фев 19, 14:20 [21806429] Ответить | Цитировать Сообщить модератору |
Petro123 Member Откуда: Загрузочный сектор Москвы (AutoPOI.ru) Сообщений: 38643 |
|
||
11 фев 19, 14:21 [21806431] Ответить | Цитировать Сообщить модератору |
Nechto Member Откуда: Сообщений: 813 |
Буду исходить из того, что обсуждалось выше в дебри лезьте не буду. Нужно создать сервис, который будет раздавать страницы(классы) клиентам. Сами страницы и модели хранятся в сборках на сервере. Простая схема: "Сборка ядра" - содержит в себе интерфейсы, которые используются "Сборкой сервиса" и "Сборкой клиента" "Сборка сервиса" - при запросе от клиента, инициализирует класс и отправляет его клиенту "Сборка клиента" - клиент получает класс и работает с ним через интерфейс. |
11 фев 19, 15:38 [21806547] Ответить | Цитировать Сообщить модератору |
Shocker.Pro Member Откуда: ->|<- :адуктО Сообщений: 21072 |
То есть на этапе компиляции клиент ничего не знает о тех интерфейсах, с которыми ему предстоит работать. Таким образом, он сможет с ними работать только через рефлексию. |
11 фев 19, 15:46 [21806561] Ответить | Цитировать Сообщить модератору |
Nechto Member Откуда: Сообщений: 813 |
Да, они скомпилированы отдельно, единственное что их связывает это интерфейсы в "сборке ядра" |
||
11 фев 19, 15:50 [21806565] Ответить | Цитировать Сообщить модератору |
Shocker.Pro Member Откуда: ->|<- :адуктО Сообщений: 21072 |
Тогда в чем вопрос, не очень понятно. Получил сборку, загрузил ее в домен, работаешь с ней через интерфейсы. Причем тут WCF? |
11 фев 19, 15:56 [21806570] Ответить | Цитировать Сообщить модератору |
Petro123 Member Откуда: Загрузочный сектор Москвы (AutoPOI.ru) Сообщений: 38643 |
Ты это сам придумал? Это делали (передача абстрактного базового класса или интерфейса) в прошлом веке в дельфи. Еще когда Net не было. Для плагинов. Брось фигней страдать. |
||
11 фев 19, 16:09 [21806582] Ответить | Цитировать Сообщить модератору |
Shocker.Pro Member Откуда: ->|<- :адуктО Сообщений: 21072 |
|
||
11 фев 19, 16:16 [21806598] Ответить | Цитировать Сообщить модератору |
Petro123 Member Откуда: Загрузочный сектор Москвы (AutoPOI.ru) Сообщений: 38643 |
Shocker.Pro, Ну дак это динамика. А я ее не люблю)). Поэтому ТС к тебе. |
11 фев 19, 16:33 [21806621] Ответить | Цитировать Сообщить модератору |
Nechto Member Откуда: Сообщений: 813 |
1. Обновление в реал тайме. Если в wcf, все таки есть способ передать клиенту класс, о котором клиент нечего не знает и работать с ним исключительно через интерфейс. То обновление отпадет само по себе, так как клиент берет логику с сервера. Если не wcf, то придется вернуться к варианту реализации через appdomain. 2. Повышает уровень безопасности и упрощает администрирование. Так как код, лежит на сервере, пользователь не имеет доступа к библиотекам напрямую.
[DataContract] [KnownType(typeof(A))] public class DataRouter { [DataMember] public string TypeName {get; set;} [DataMember] public object Router {get; set;} // или так public IRouter Router {get; set;} } public class A : IRouter { public int Id { get; set; } public int GetId () { return Id; } } Я не понимаю одного, то что я хочу это можно реализовать через Wcf или нет? Просто не хочется копать и в итоге напороться на камень. |
||||
12 фев 19, 10:37 [21807119] Ответить | Цитировать Сообщить модератору |
Petro123 Member Откуда: Загрузочный сектор Москвы (AutoPOI.ru) Сообщений: 38643 |
Убедил? 2. WCF это soap и стандарт. Связи и наследование не передается. Убедил? Если нет, то ты верующий и не лечится. |
||
12 фев 19, 10:44 [21807129] Ответить | Цитировать Сообщить модератору |
Shocker.Pro Member Откуда: ->|<- :адуктО Сообщений: 21072 |
1) Через Wcf можно передать данные 2) Сборка - это просто набор бинарных данных, запакуй dll в base64 и передавай (ну или какие там способы передачи бинарников в wcf из коробки?) То есть wcf тут только как протокол, с тем же успехом можешь хоть из БД получать сборку через sql-коннектор - ничего не меняется |
||
12 фев 19, 11:34 [21807186] Ответить | Цитировать Сообщить модератору |
Nechto Member Откуда: Сообщений: 813 |
Выходит, что передачу можно сделать, через стандартный тип byte[]. Только вот интересно, к примеру клиент получил массив бинарников и как работать с ними? Сохранять локально и потом грузить в appdomain? Или можно на лету из них извлечь необходимые классы? Да и вообще, скорость работы этого схемы будет наверное тормознутая. |
||||||||
12 фев 19, 13:05 [21807311] Ответить | Цитировать Сообщить модератору |
Shocker.Pro Member Откуда: ->|<- :адуктО Сообщений: 21072 |
|
||||
12 фев 19, 13:13 [21807317] Ответить | Цитировать Сообщить модератору |
Petro123 Member Откуда: Загрузочный сектор Москвы (AutoPOI.ru) Сообщений: 38643 |
А для создания распределенного сетевого кода у него скилов не хватает. И шарп для этого не подходит. |
||
12 фев 19, 13:32 [21807331] Ответить | Цитировать Сообщить модератору |
Nechto Member Откуда: Сообщений: 813 |
Выходит не получается мне обойтись без хранения сборки dll на клиенте. Все равно их приходится скачивать на клиент и потом с ними работать. Печально :( Ваши рекомендации я так интерпретирую: Wcf задействовать как шлюз для обновления (передача бинарного набора, сборки dll). GAC как вариант для хранения, сборок. Мне вот интересно, если бы у Вас была подобная задача. Вы бы каким путем пошли? |
||||||
12 фев 19, 13:32 [21807332] Ответить | Цитировать Сообщить модератору |
Petro123 Member Откуда: Загрузочный сектор Москвы (AutoPOI.ru) Сообщений: 38643 |
|
||
12 фев 19, 13:34 [21807336] Ответить | Цитировать Сообщить модератору |
Petro123 Member Откуда: Загрузочный сектор Москвы (AutoPOI.ru) Сообщений: 38643 |
|
||
12 фев 19, 13:35 [21807337] Ответить | Цитировать Сообщить модератору |
Petro123 Member Откуда: Загрузочный сектор Москвы (AutoPOI.ru) Сообщений: 38643 |
|
||
12 фев 19, 13:36 [21807338] Ответить | Цитировать Сообщить модератору |
Shocker.Pro Member Откуда: ->|<- :адуктО Сообщений: 21072 |
|
||||
12 фев 19, 13:46 [21807352] Ответить | Цитировать Сообщить модератору |
Shocker.Pro Member Откуда: ->|<- :адуктО Сообщений: 21072 |
|
||||
12 фев 19, 13:47 [21807353] Ответить | Цитировать Сообщить модератору |
Petro123 Member Откуда: Загрузочный сектор Москвы (AutoPOI.ru) Сообщений: 38643 |
Любителю динамики:
|
||||
12 фев 19, 13:58 [21807374] Ответить | Цитировать Сообщить модератору |
Nechto Member Откуда: Сообщений: 813 |
Извините меня, если вам мои вопросы показались глупыми. Но мне нужно было убедиться в своих суждениях (могу ли я обойтись без добавления в домен и не хранить сборки на клиенте), как выяснилось нет, и вы мне помогли это сделать. Спасибо! |
||||||
12 фев 19, 14:26 [21807418] Ответить | Цитировать Сообщить модератору |
Shocker.Pro Member Откуда: ->|<- :адуктО Сообщений: 21072 |
|
||
12 фев 19, 14:30 [21807421] Ответить | Цитировать Сообщить модератору |
Nechto Member Откуда: Сообщений: 813 |
Не не, лучше c# или java
|
|||||||
12 фев 19, 14:31 [21807422] Ответить | Цитировать Сообщить модератору |
Petro123 Member Откуда: Загрузочный сектор Москвы (AutoPOI.ru) Сообщений: 38643 |
Nechto, Странный ты. Там один ответ с одним +1. Нашел мнение, да совсем по другому вопросу. |
12 фев 19, 14:38 [21807433] Ответить | Цитировать Сообщить модератору |
Nechto Member Откуда: Сообщений: 813 |
Да не странный, просто первую попавшую ссылку приложил, прочитав заголовок. Ну да ладно с этой ссылкой. Вот зачем, вы мне предлагаете этот язык программирования, если использую и изучаю c#? |
||
12 фев 19, 14:58 [21807475] Ответить | Цитировать Сообщить модератору |
Petro123 Member Откуда: Загрузочный сектор Москвы (AutoPOI.ru) Сообщений: 38643 |
Nechto, Можно пойти на врача, а мечтать о динамике, тьфу, петь песни. Вот я вам и дал ссылку. Вас с динамикой, не много в шарпе на самом деле. Терпи. |
12 фев 19, 15:20 [21807508] Ответить | Цитировать Сообщить модератору |
ВМоисеев Member Откуда: Редкино Сообщений: 2020 |
>Nechto, сегодня, 13:32 [21807332] >Выходит не получается мне обойтись … Вы бы каким путем пошли? <Вам надо создать хотя-бы одно реальное приложение на C#, оценить его компоненты и, думаю, желание таскать отдельные классы откуда-то на клиента отпадет само-собой. Для примера приведу цифири конкретного одностраничного WPF приложения: 1. Обслуживает 18 таблиц MS SQL - SELECT, INSERT, UPDATE и DELETE. 2. 1 главная страница MainWindow.xaml 3. 29 панелей (UserControl) реализуют графический интерфейс для (1), включая работу с документами Word и графическими файлами. Бинарный вариант приложения занимает 916 Кбайт в папке диска, из них wpf_ИнспекцииВД.pdb (описание графических компонент) - 551 Кбайт. Иными словами, собственно рабочий код на C# - компактен, заниматься одним классом не имеет смысла, заниматься - так приложением в целом. Привожу и сжатый вариант приложения в .rar контейнере - 164 Кбайт: |
12 фев 19, 16:53 [21807647] Ответить | Цитировать Сообщить модератору |
Ролг Хупин Member Откуда: Чебаркуль Сообщений: 3263 |
чтобы не мутил как минимум ![]() |
||||
13 фев 19, 17:44 [21808788] Ответить | Цитировать Сообщить модератору |
Топик располагается на нескольких страницах: 1 2 [все] |
Все форумы / WCF, Web Services, Remoting | ![]() |