|
Как передать интерфейс через wcf
|
|||
---|---|---|---|
#18+
Только недавно познакомился с wcf. Пока особо глубокого понимания нет. Столкнулся с такой проблемой не получается передать класс, который наследован от интерфейса Класс для передачи: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8.
Интерфейс-предок класса: Код: plaintext 1. 2. 3. 4. 5.
Реализация сервиса: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8.
На клиенте получаю исключение "The underlying connection was closed: The connection was closed unexpectedly." Если не наследовать класс от интерфейса то все работает нормально. Я предполагаю что на интерфейс тоже нужно повесить кокой-то атрибут но пока не смог найти какой. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.06.2011, 18:26 |
|
Как передать интерфейс через wcf
|
|||
---|---|---|---|
#18+
Mr_GOD, Ну если вам нужно решение для работы - то используйте DataTable - это то же самое, что создали вы, только отдебагированное. :) Если вы учитесь - и вам надо именно так - то маловато информации. Включите диагностику в конфигурации сервиса и клиента - и после обращения и обвала посмотрите полученные логи. Там обычно все написано точно. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.06.2011, 10:56 |
|
Как передать интерфейс через wcf
|
|||
---|---|---|---|
#18+
D129, я учусь. Можешь подробнее рассказать о том что надо сделать что бы посмотреть в логи? ... |
|||
:
Нравится:
Не нравится:
|
|||
26.06.2011, 13:47 |
|
Как передать интерфейс через wcf
|
|||
---|---|---|---|
#18+
Я попробовал тоже самое с DataTable. Ошибка такая же... ... |
|||
:
Нравится:
Не нравится:
|
|||
26.06.2011, 14:06 |
|
Как передать интерфейс через wcf
|
|||
---|---|---|---|
#18+
Не проверял именно вашу ситуацию (наследование от интерфейса), но в целом, если вы наследуете один контракт данных от другого и работаете через базовый контракт (как у вас в примере операция возвращает IDataContainer, хотя в реальности за ним скрывается DataContainer) - то у базового контракта нужно указывать список всех унаследованных классов через атрибут KnownType (или у самого сервиса через ServiceKnownType). Т.е. в вашем случае следовало объявить: Код: plaintext 1. 2. 3. 4. 5. 6.
Возможно также, вам следует перенести определение контрактов в базовый класс (хотя вообще-то определения контрактов вообще не обязательны - главное чтобы свойства были публичными). Но вообще вы используете довольно необычный вариант так что может статься он в принципе не заработает. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.06.2011, 15:41 |
|
Как передать интерфейс через wcf
|
|||
---|---|---|---|
#18+
Вся проблема в том что у атрибутов [KnownType] и [DataContract] есть ограничение "It is only valid on 'class, struct' declarations." ... |
|||
:
Нравится:
Не нравится:
|
|||
26.06.2011, 17:18 |
|
Как передать интерфейс через wcf
|
|||
---|---|---|---|
#18+
Вы меня зацепили :) - решил все-таки найти решение. Посмотрите на такой вариант: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28.
Т.к. у interface нельзя объявлять ни [DataContract], ни [Serializable], то обходимся без них (правда упралять процессом сериализации уже будет нельзя. А чтобы работало наследование объявляем у контракта сервиса [ServiceKnownType(typeof(DataContainer))]. Подойдет такой вариант? ... |
|||
:
Нравится:
Не нравится:
|
|||
27.06.2011, 15:18 |
|
Как передать интерфейс через wcf
|
|||
---|---|---|---|
#18+
МихаилР, Спасибо большое))) Работает! Как оказалось все гораздо проще чем я думал. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.06.2011, 12:54 |
|
Как передать интерфейс через wcf
|
|||
---|---|---|---|
#18+
Упс... Я погорячился) Не заметил что приведение типов. А клиент как не знал об интерфейсе так и не знает... Почитал литературу, мне почему то кажется уже что передать класс через интерфейс клиенту не возможно. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.06.2011, 13:05 |
|
Как передать интерфейс через wcf
|
|||
---|---|---|---|
#18+
Выкладываю солюшн по вс 2010. Может кто-нибудь все таки сможет решить эту проблем ... |
|||
:
Нравится:
Не нравится:
|
|||
28.06.2011, 13:22 |
|
Как передать интерфейс через wcf
|
|||
---|---|---|---|
#18+
Mr_GODУпс... Я погорячился) Не заметил что приведение типов. А клиент как не знал об интерфейсе так и не знает... . Вот это уточните, пожалуйста - что смущает (где приведение, где его не должно было быть)? Mr_GODПочитал литературу, мне почему то кажется уже что передать класс через интерфейс клиенту не возможно. Ну вообще это логично - интерфейс с точки зрения контрактов данных - это пустышка, "контракт". Поэтому передавать его на клиента не имеет смысла - все интерфейсы передаются как object, но при этом, скрывающийся за ним объект передается корректно. Если вы хотите, чтобы интерфейсы были и на клиенте - вы можете сами вручную доработать генерацию proxy (сгенерировать свои). Это будет не слишком переносимо, но работать будет. А вообще интересно - почему вы так уперлись в интерфейсы? Почему не хотите использовать классы? ... |
|||
:
Нравится:
Не нравится:
|
|||
28.06.2011, 14:06 |
|
Как передать интерфейс через wcf
|
|||
---|---|---|---|
#18+
МихаилР, МихаилРВот это уточните, пожалуйста - что смущает (где приведение, где его не должно было быть)? Я в теле сервиса приводил интерфейс к классу и передавал именно класс. Когда проверял то что вы предложили то забыл про это. И по этому все заработало. А что касается интерфейсов в принципе, ну люблю я в общем интерфейсы и меня заинтересовала именно абстрагирование от конкретных классов. Просто если бы у меня было бы несколько реализаций данного интерфейса то передавать их бы было очень проблематично. Вот я и начал экспериментировать. Как оказалось достаточно гибкую штуку пописать не получилось(( ... |
|||
:
Нравится:
Не нравится:
|
|||
28.06.2011, 14:11 |
|
Как передать интерфейс через wcf
|
|||
---|---|---|---|
#18+
Mr_GODЯ в теле сервиса приводил интерфейс к классу и передавал именно класс. Когда проверял то что вы предложили то забыл про это. И по этому все заработало. Все равно не понял. Я вот передаю сам интерфейс - посмотрите мой пример, он работает. Почему вы не можете сделать так же - не понимаю. Mr_GODА что касается интерфейсов в принципе, ну люблю я в общем интерфейсы и меня заинтересовала именно абстрагирование от конкретных классов. В принципе, можно перейти на абстрактные классы, если только не требуется множественная реализация нескольких интерфейсов. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.06.2011, 14:34 |
|
Как передать интерфейс через wcf
|
|||
---|---|---|---|
#18+
Все я понял общий смысл. Я имел в виду что клиент не получает сигнатуры интерфейса. вобщем я понял что их передавать приводя к типу object. Спасибо воббщем ... |
|||
:
Нравится:
Не нравится:
|
|||
28.06.2011, 20:15 |
|
Как передать интерфейс через wcf
|
|||
---|---|---|---|
#18+
Mr_GOD, Вот это вот все вынести в отдельную библиотеку и прицепить ее в проекты как сервера, так и клиента, а не использовать индусский клиентогенератор студии. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18.
... |
|||
:
Нравится:
Не нравится:
|
|||
29.06.2011, 20:27 |
|
|
start [/forum/topic.php?fid=19&fpage=20&tid=1397420]: |
0ms |
get settings: |
10ms |
get forum list: |
16ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
78ms |
get topic data: |
11ms |
get forum data: |
2ms |
get page messages: |
54ms |
get tp. blocked users: |
2ms |
others: | 14ms |
total: | 195ms |
0 / 0 |