powered by simpleCommunicator - 2.0.40     © 2025 Programmizd 02
Форумы / WCF, Web Services, Remoting [игнор отключен] [закрыт для гостей] / Как сослаться на базовые методы сервиса на клиентской стороне?
7 сообщений из 7, страница 1 из 1
Как сослаться на базовые методы сервиса на клиентской стороне?
    #39313900
Doomplay998
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пусть у меня есть на сервере базовый классс службы, и пара производных от него. Я с помощью "Add Service Reference" создал на клиенте прокси для производных классов службы. Теперь хочу на этом же клиенте передать в какой-нибудь метод любой из этих проксей так, чтобы можно было воспользоваться базовыми методами службы. Типа такого:

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
// on the server side
BaseService 
ServiceA : BaseService
ServiceB : BaseService

// somewhere on the client side,
// where proxyBase is a proxy for ServiceA _OR_ ServiceB)
void WorkMethod(ProxyBase proxyBase)
{
    proxyBase.BaseMethod();
}



Как этого добиться? Ведь созданные прокси - это совершенно независимые классы без общего предка.

Другими словами, на сервере известно, что службы имеют общего предка, и можно передать эти службы как базовый класс, а на сервере - нет.
...
Рейтинг: 0 / 0
Как сослаться на базовые методы сервиса на клиентской стороне?
    #39313990
Doomplay998
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вроде, есть возможность вручную сгенерить прокси-классы, отнаследовавшись от встроенного в .NET ClientBase. Тогда в моей задаче нужно что-то вроде:

1) создать базовую службу, а не просто класс базовой службы, от которой наследуются другие классы служб (т. е. запустить эту службу с базовой реализацией);

2) сгенерить прокси на эту базовую службу с помощью той же "Add service reference";

3) вручную создать потомки от получившегося базового прокси, которые как-то "переназначить" на службы ServiceA и ServiceB?

Как-то слишком сложно получается, да и не уверен, что это в принципе возможно - то, что я выше написал.
...
Рейтинг: 0 / 0
Как сослаться на базовые методы сервиса на клиентской стороне?
    #39317888
Doomplay998
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я добавил пример кода иерархии моих служб - всё очень просто и примитивно.

base service:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
[ServiceContract()]
public interface IServiceBase
{
    [OperationContract]
    void BaseMethod();
}

public class ServiceBase : IServiceBase
{
    public void BaseMethod()
    {}
}



service A:
Код: c#
1.
2.
3.
4.
5.
6.
[ServiceContract()]
public interface IServiceA : IServiceBase
{}

public class ServiceA : ServiceBase, IServiceA
{}



service B:
Код: c#
1.
2.
3.
4.
5.
6.
[ServiceContract()]
public interface IServiceB : IServiceBase
{}

public class ServiceB : ServiceBase, IServiceB
{}



На клиенте я создаю прокси-классы с помощью инструмента "Add service reference" в Студии:
Код: c#
1.
2.
ProxyA proxyServiceA;
ProxyB proxyServiceB;



И я хочу передать эти прокси в метод. Как? Типа такого:

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
// somewhere on the client side
WorkMethod(proxyServiceA);
WorkMethod(proxyServiceB);

// На самом деле я не знаю, какой тип должен быть у proxyBase и как этот тип объявить.
// Это что-то типа псевдокода.
void WorkMethod(ProxyBase proxyBase)
{
    proxyBase.BaseMethod();
}



Т. е. я хочу передать эти прокси в качестве параметра и вызвать метод из базового класса сервиса. Как это сделать?
...
Рейтинг: 0 / 0
Как сослаться на базовые методы сервиса на клиентской стороне?
    #39317891
Doomplay998
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, эти два прокси -

ProxyA proxyServiceA;
ProxyB proxyServiceB;

это ссылки на две разные службы .

Может ли быть какой-то базовый класс на клиенте, который бы распознавался как базовый для этих двух проксей и его можно было бы указать в качестве параметра в методе WorkMethod?
...
Рейтинг: 0 / 0
Как сослаться на базовые методы сервиса на клиентской стороне?
    #39317904
Doomplay998
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вобщем, выделю главный вопрос.

Как сделать так, чтобы на клиенте был класс, который бы был базовым для прокси-классов, ссылающихся на две разные службы, имеющие тоже базовый класс (на серверной стороне)?

Ну, естественно, это не должен быть фреймворковский ClientBase/
...
Рейтинг: 0 / 0
Как сослаться на базовые методы сервиса на клиентской стороне?
    #39329257
ProBiotek
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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.
var channelFactory =
                new ChannelFactory<IEchoService>(
                    "WSHttpBinding_IService" // endpoint name
                    ); 

            IService channel = channelFactory.CreateChannel();
            Message result = channel.Echo(
                new Message
                    {
                        Text = "Hey "  
                    });



В вашем случае нужно создавать 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 .
...
Рейтинг: 0 / 0
Как сослаться на базовые методы сервиса на клиентской стороне?
    #39329291
Doomplay998
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ProBiotek,

т. е. то, что я не могу создать автоматически сгенеренный прокси для базового класса службы - это ограничение генераторы этих проксей, а не вообще ограничение WCF?

Спасибо, попробую ваш совет.
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / WCF, Web Services, Remoting [игнор отключен] [закрыт для гостей] / Как сослаться на базовые методы сервиса на клиентской стороне?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]