Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / WCF, Web Services, Remoting Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 c# wcf передать класс из сервиса клиенту  [new]
Nechto
Member

Откуда:
Сообщений: 806
Добрый день!
Уважаемые гуру, подскажите пожалуйста, правильно ли я оцениваю возможности 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]     Ответить | Цитировать Сообщить модератору
 Re: c# wcf передать класс из сервиса клиенту  [new]
Shocker.Pro
Member

Откуда: ->|<- :адуктО
Сообщений: 21005
Nechto
и как её передать клиенту не могу себе представить
Изучай вопрос сериализации и десериализации.
Естественно, ты не можешь передать объект из домена в домен, не выполняя сериализацию.
11 фев 19, 13:50    [21806376]     Ответить | Цитировать Сообщить модератору
 Re: c# wcf передать класс из сервиса клиенту  [new]
Nechto
Member

Откуда:
Сообщений: 806
Shocker.Pro,
Оно?
+
https://docs.microsoft.com/ru-ru/dotnet/framework/wcf/feature-details/serialization-and-deserialization

Все равно не могу понять. Ведь все равно нужно передать класс целиком (со всеми свойствами, методами, наследованиями, using-ми и др.). Разве можно это сделать в формате XML?
11 фев 19, 14:00    [21806393]     Ответить | Цитировать Сообщить модератору
 Re: c# wcf передать класс из сервиса клиенту  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 38643
Nechto,
Убери интерфейсы и не говори слово ссылка. Просто передай класс.
Всё
11 фев 19, 14:03    [21806399]     Ответить | Цитировать Сообщить модератору
 Re: c# wcf передать класс из сервиса клиенту  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 38643
Nechto
// интерфейс IRouter находится в общедоступной библиотеке для сервиса и клиента
это не надо
11 фев 19, 14:04    [21806402]     Ответить | Цитировать Сообщить модератору
 Re: c# wcf передать класс из сервиса клиенту  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 38643
Nechto
класс целиком
нет. Там помечается что передать.
11 фев 19, 14:05    [21806404]     Ответить | Цитировать Сообщить модератору
 Re: c# wcf передать класс из сервиса клиенту  [new]
Nechto
Member

Откуда:
Сообщений: 806
Petro123
Nechto,
Убери интерфейсы и не говори слово ссылка. Просто передай класс.
Всё


Такой способ передачи работает успешно, я проверял. Мне то нужно понять можно ли передать класс при помощи базового типа object или наследованием IRouter. Хотя наследование IRouter выполняется в любом случае.
11 фев 19, 14:11    [21806412]     Ответить | Цитировать Сообщить модератору
 Re: c# wcf передать класс из сервиса клиенту  [new]
Shocker.Pro
Member

Откуда: ->|<- :адуктО
Сообщений: 21005
Nechto
Ведь все равно нужно передать класс целиком (со всеми свойствами, методами, наследованиями, using-ми и др.)
Причем тут методы и т.п.? WCF передает данные, а не код. Если тебе нужно передавать код - ну запакуй dll-ку, передай ее на клиент, там распакуй, загрузи в домен и используй.
Задача неясна.
11 фев 19, 14:17    [21806423]     Ответить | Цитировать Сообщить модератору
 Re: c# wcf передать класс из сервиса клиенту  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 38643
Nechto
работает успешно, я проверял. Мне то нужно
вам нужно не как у всех.
ОК

Nechto
Мне то нужно понять можно ли передать класс при помощи базового типа object или наследованием IRouter.

Можно ли сделать сложнее?))))
Мне трудно отвечать на такой вопрос. Он не имеет цели.
11 фев 19, 14:19    [21806427]     Ответить | Цитировать Сообщить модератору
 Re: c# wcf передать класс из сервиса клиенту  [new]
Nechto
Member

Откуда:
Сообщений: 806
Shocker.Pro
Nechto
Ведь все равно нужно передать класс целиком (со всеми свойствами, методами, наследованиями, using-ми и др.)
Причем тут методы и т.п.? WCF передает данные, а не код. Если тебе нужно передавать код - ну запакуй dll-ку, передай ее на клиент, там распакуй, загрузи в домен и используй.
Задача неясна.


Подождите, попробую кратно разъяснить задачу!
11 фев 19, 14:20    [21806429]     Ответить | Цитировать Сообщить модератору
 Re: c# wcf передать класс из сервиса клиенту  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 38643
Nechto
попробую кратно разъяснить задачу!
и не забудь что в soap ЯП разный сервера и клиента.
11 фев 19, 14:21    [21806431]     Ответить | Цитировать Сообщить модератору
 Re: c# wcf передать класс из сервиса клиенту  [new]
Nechto
Member

Откуда:
Сообщений: 806
Буду исходить из того, что обсуждалось выше в дебри лезьте не буду.

Нужно создать сервис, который будет раздавать страницы(классы) клиентам. Сами страницы и модели хранятся в сборках на сервере.

Простая схема:
"Сборка ядра" - содержит в себе интерфейсы, которые используются "Сборкой сервиса" и "Сборкой клиента"
"Сборка сервиса" - при запросе от клиента, инициализирует класс и отправляет его клиенту
"Сборка клиента" - клиент получает класс и работает с ним через интерфейс.
11 фев 19, 15:38    [21806547]     Ответить | Цитировать Сообщить модератору
 Re: c# wcf передать класс из сервиса клиенту  [new]
Shocker.Pro
Member

Откуда: ->|<- :адуктО
Сообщений: 21005
То есть на этапе компиляции клиент ничего не знает о тех интерфейсах, с которыми ему предстоит работать. Таким образом, он сможет с ними работать только через рефлексию.
11 фев 19, 15:46    [21806561]     Ответить | Цитировать Сообщить модератору
 Re: c# wcf передать класс из сервиса клиенту  [new]
Nechto
Member

Откуда:
Сообщений: 806
Shocker.Pro
То есть на этапе компиляции клиент ничего не знает о тех интерфейсах, с которыми ему предстоит работать. Таким образом, он сможет с ними работать только через рефлексию.

Да, они скомпилированы отдельно, единственное что их связывает это интерфейсы в "сборке ядра"
11 фев 19, 15:50    [21806565]     Ответить | Цитировать Сообщить модератору
 Re: c# wcf передать класс из сервиса клиенту  [new]
Shocker.Pro
Member

Откуда: ->|<- :адуктО
Сообщений: 21005
Тогда в чем вопрос, не очень понятно. Получил сборку, загрузил ее в домен, работаешь с ней через интерфейсы. Причем тут WCF?
11 фев 19, 15:56    [21806570]     Ответить | Цитировать Сообщить модератору
 Re: c# wcf передать класс из сервиса клиенту  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 38643
Nechto
Буду исходить из того, что обсуждалось выше в дебри лезьте не буду.

Нужно создать сервис, который будет раздавать страницы(классы) клиентам. Сами страницы и модели хранятся в сборках на сервере.

Простая схема:
"Сборка ядра" - содержит в себе интерфейсы, которые используются "Сборкой сервиса" и "Сборкой клиента"
"Сборка сервиса" - при запросе от клиента, инициализирует класс и отправляет его клиенту
"Сборка клиента" - клиент получает класс и работает с ним через интерфейс.

Ты это сам придумал?
Это делали (передача абстрактного базового класса или интерфейса) в прошлом веке в дельфи. Еще когда Net не было.
Для плагинов.
Брось фигней страдать.
11 фев 19, 16:09    [21806582]     Ответить | Цитировать Сообщить модератору
 Re: c# wcf передать класс из сервиса клиенту  [new]
Shocker.Pro
Member

Откуда: ->|<- :адуктО
Сообщений: 21005
Petro123
Для плагинов.
Ну да, фактически автор и пытается создать плагин. Так что надо его отправить читать, как делают плагины в .NET
11 фев 19, 16:16    [21806598]     Ответить | Цитировать Сообщить модератору
 Re: c# wcf передать класс из сервиса клиенту  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 38643
Shocker.Pro,
Ну дак это динамика.
А я ее не люблю)).
Поэтому ТС к тебе.
11 фев 19, 16:33    [21806621]     Ответить | Цитировать Сообщить модератору
 Re: c# wcf передать класс из сервиса клиенту  [new]
Nechto
Member

Откуда:
Сообщений: 806
Petro123
Ты это сам придумал?
Это делали (передача абстрактного базового класса или интерфейса) в прошлом веке в дельфи. Еще когда Net не было.
Для плагинов.
Брось фигней страдать.
Да сам, исходя из своих соображений. Дело в том, что я давно подумываю как мне в моих приложениях, реализовать следующие задачи (Как вы заметили, я люблю динамику и универсальность. Не знаю плюс это или минус, но мнения расходятся):
1. Обновление в реал тайме.
Если в wcf, все таки есть способ передать клиенту класс, о котором клиент нечего не знает и работать с ним исключительно через интерфейс. То обновление отпадет само по себе, так как клиент берет логику с сервера.
Если не wcf, то придется вернуться к варианту реализации через appdomain.

2. Повышает уровень безопасности и упрощает администрирование.
Так как код, лежит на сервере, пользователь не имеет доступа к библиотекам напрямую.
Shocker.Pro
только через рефлексию
[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]     Ответить | Цитировать Сообщить модератору
 Re: c# wcf передать класс из сервиса клиенту  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 38643
Nechto
, я люблю динамику и универсальность. Не знаю плюс это или минус, но мнения расходятся):
для динамике должны быть обоснования. Для статики не нужны, есть ГОСТ.
Убедил?
2. WCF это soap и стандарт.
Связи и наследование не передается.
Убедил?
Если нет, то ты верующий и не лечится.
12 фев 19, 10:44    [21807129]     Ответить | Цитировать Сообщить модератору
 Re: c# wcf передать класс из сервиса клиенту  [new]
Shocker.Pro
Member

Откуда: ->|<- :адуктО
Сообщений: 21005
Nechto
Я не понимаю одного, то что я хочу это можно реализовать через Wcf или нет? Просто не хочется копать и в итоге напороться на камень.

1) Через Wcf можно передать данные
2) Сборка - это просто набор бинарных данных, запакуй dll в base64 и передавай (ну или какие там способы передачи бинарников в wcf из коробки?)

То есть wcf тут только как протокол, с тем же успехом можешь хоть из БД получать сборку через sql-коннектор - ничего не меняется
12 фев 19, 11:34    [21807186]     Ответить | Цитировать Сообщить модератору
 Re: c# wcf передать класс из сервиса клиенту  [new]
Nechto
Member

Откуда:
Сообщений: 806
Petro123
Nechto
, я люблю динамику и универсальность. Не знаю плюс это или минус, но мнения расходятся):
для динамике должны быть обоснования. Для статики не нужны, есть ГОСТ.
Убедил?
2. WCF это soap и стандарт.
Связи и наследование не передается.
Убедил?
Если нет, то ты верующий и не лечится.
Убедили, возразить не чем.

Shocker.Pro
Nechto
Я не понимаю одного, то что я хочу это можно реализовать через Wcf или нет? Просто не хочется копать и в итоге напороться на камень.

1) Через Wcf можно передать данные
2) Сборка - это просто набор бинарных данных, запакуй dll в base64 и передавай (ну или какие там способы передачи бинарников в wcf из коробки?)

То есть wcf тут только как протокол, с тем же успехом можешь хоть из БД получать сборку через sql-коннектор - ничего не меняется

Выходит, что передачу можно сделать, через стандартный тип byte[].
Только вот интересно, к примеру клиент получил массив бинарников и как работать с ними? Сохранять локально и потом грузить в appdomain? Или можно на лету из них извлечь необходимые классы?

Да и вообще, скорость работы этого схемы будет наверное тормознутая.
12 фев 19, 13:05    [21807311]     Ответить | Цитировать Сообщить модератору
 Re: c# wcf передать класс из сервиса клиенту  [new]
Shocker.Pro
Member

Откуда: ->|<- :адуктО
Сообщений: 21005
Nechto
Сохранять локально и потом грузить в appdomain? Или можно на лету из них извлечь необходимые классы?
Что значит "извлечь классы"? Ты собираешься запускать код. У тебя не получится запустить код, не загружая его в домен.

Nechto
Да и вообще, скорость работы этого схемы будет наверное тормознутая.
С чего вдруг? Что тут будет тормозить? Самое узкое место - это скачка плагина. Но ты его скачал один раз, дальше он у тебя лежит локально, грузишь в домен при необходимости. Можешь вообще в GAC добавить.
12 фев 19, 13:13    [21807317]     Ответить | Цитировать Сообщить модератору
 Re: c# wcf передать класс из сервиса клиенту  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 38643
Shocker.Pro
плагина
это слово он всячески старается избегать).
А для создания распределенного сетевого кода у него скилов не хватает.
И шарп для этого не подходит.
12 фев 19, 13:32    [21807331]     Ответить | Цитировать Сообщить модератору
 Re: c# wcf передать класс из сервиса клиенту  [new]
Nechto
Member

Откуда:
Сообщений: 806
Shocker.Pro
Nechto
Сохранять локально и потом грузить в appdomain? Или можно на лету из них извлечь необходимые классы?
Что значит "извлечь классы"? Ты собираешься запускать код. У тебя не получится запустить код, не загружая его в домен.

Nechto
Да и вообще, скорость работы этого схемы будет наверное тормознутая.
С чего вдруг? Что тут будет тормозить? Самое узкое место - это скачка плагина. Но ты его скачал один раз, дальше он у тебя лежит локально, грузишь в домен при необходимости. Можешь вообще в GAC добавить.


Выходит не получается мне обойтись без хранения сборки dll на клиенте. Все равно их приходится скачивать на клиент и потом с ними работать. Печально :(

Ваши рекомендации я так интерпретирую:
Wcf задействовать как шлюз для обновления (передача бинарного набора, сборки dll).
GAC как вариант для хранения, сборок.

Мне вот интересно, если бы у Вас была подобная задача. Вы бы каким путем пошли?
12 фев 19, 13:32    [21807332]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / WCF, Web Services, Remoting Ответить