|
Как сослаться на базовые методы сервиса на клиентской стороне?
|
|||
---|---|---|---|
#18+
Пусть у меня есть на сервере базовый классс службы, и пара производных от него. Я с помощью "Add Service Reference" создал на клиенте прокси для производных классов службы. Теперь хочу на этом же клиенте передать в какой-нибудь метод любой из этих проксей так, чтобы можно было воспользоваться базовыми методами службы. Типа такого: Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11.
Как этого добиться? Ведь созданные прокси - это совершенно независимые классы без общего предка. Другими словами, на сервере известно, что службы имеют общего предка, и можно передать эти службы как базовый класс, а на сервере - нет. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.09.2016, 09:28 |
|
Как сослаться на базовые методы сервиса на клиентской стороне?
|
|||
---|---|---|---|
#18+
Вроде, есть возможность вручную сгенерить прокси-классы, отнаследовавшись от встроенного в .NET ClientBase. Тогда в моей задаче нужно что-то вроде: 1) создать базовую службу, а не просто класс базовой службы, от которой наследуются другие классы служб (т. е. запустить эту службу с базовой реализацией); 2) сгенерить прокси на эту базовую службу с помощью той же "Add service reference"; 3) вручную создать потомки от получившегося базового прокси, которые как-то "переназначить" на службы ServiceA и ServiceB? Как-то слишком сложно получается, да и не уверен, что это в принципе возможно - то, что я выше написал. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.09.2016, 10:48 |
|
Как сослаться на базовые методы сервиса на клиентской стороне?
|
|||
---|---|---|---|
#18+
Я добавил пример кода иерархии моих служб - всё очень просто и примитивно. base service: Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12.
service A: Код: c# 1. 2. 3. 4. 5. 6.
service B: Код: c# 1. 2. 3. 4. 5. 6.
На клиенте я создаю прокси-классы с помощью инструмента "Add service reference" в Студии: Код: c# 1. 2.
И я хочу передать эти прокси в метод. Как? Типа такого: Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.
Т. е. я хочу передать эти прокси в качестве параметра и вызвать метод из базового класса сервиса. Как это сделать? ... |
|||
:
Нравится:
Не нравится:
|
|||
29.09.2016, 14:50 |
|
Как сослаться на базовые методы сервиса на клиентской стороне?
|
|||
---|---|---|---|
#18+
Да, эти два прокси - ProxyA proxyServiceA; ProxyB proxyServiceB; это ссылки на две разные службы . Может ли быть какой-то базовый класс на клиенте, который бы распознавался как базовый для этих двух проксей и его можно было бы указать в качестве параметра в методе WorkMethod? ... |
|||
:
Нравится:
Не нравится:
|
|||
29.09.2016, 14:52 |
|
Как сослаться на базовые методы сервиса на клиентской стороне?
|
|||
---|---|---|---|
#18+
Вобщем, выделю главный вопрос. Как сделать так, чтобы на клиенте был класс, который бы был базовым для прокси-классов, ссылающихся на две разные службы, имеющие тоже базовый класс (на серверной стороне)? Ну, естественно, это не должен быть фреймворковский ClientBase/ ... |
|||
:
Нравится:
Не нравится:
|
|||
29.09.2016, 15:00 |
|
Как сослаться на базовые методы сервиса на клиентской стороне?
|
|||
---|---|---|---|
#18+
Doomplay998, Возможно нужно копать в направлении Channel Factory. http://www.codeproject.com/Tips/558163/Difference-between-Proxy-and-Channel-Factory-in-WC Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11.
В вашем случае нужно создавать ChannelFactory<IServiceBase>. PS. рекомендую вообще отходить от автоматически сгенерированных прокси классов. Они слишком избыточны. Все, что в них есть лучше реализовать ручной реализацией ChannelFactory. У этого решения много плюсов, в том числе (насколько помню) в том, что Прокси классы на каждый запрос создают новый канал - т.е. тратится время на установление соединения. Если же работать с вручную созданной фабрикой, то канал создается через CreateChannel и освобождается тогда, когда он уже не нужен. Обмен в WCF идет через контракты, выраженные в интерфейсе. Создается канал настроенный на заданный интерфейс и дергаются методы этого канала. Если у сервера есть эти методы, то он их примет и обработает. Сервер вообще не знает что там на стороне клиента. Интерфейс на стороне клиента можно вообще написать от руки, сколь-угодно усеченный по отношению к количеству методов сервера (или сгенерить утилитами, а потом отредактировать). Никакой сверки идентичности контрактов не происходит насколько я понимаю - важно лишь имя вызываемого метода, соответствие количества и типов параметров. Сетевой обмен не так жестко связан как, например, код одного локального проекта. (ссылка для привлечения внимания :) ) http://martinfowler.com/bliki/TolerantReader.html be conservative in what you do, be liberal in what you accept from others . ... |
|||
:
Нравится:
Не нравится:
|
|||
18.10.2016, 18:56 |
|
Как сослаться на базовые методы сервиса на клиентской стороне?
|
|||
---|---|---|---|
#18+
ProBiotek, т. е. то, что я не могу создать автоматически сгенеренный прокси для базового класса службы - это ограничение генераторы этих проксей, а не вообще ограничение WCF? Спасибо, попробую ваш совет. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.10.2016, 19:37 |
|
|
start [/forum/topic.php?fid=19&fpage=3&tid=1396747]: |
0ms |
get settings: |
10ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
29ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
50ms |
get tp. blocked users: |
2ms |
others: | 12ms |
total: | 140ms |
0 / 0 |