powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / WCF, Web Services, Remoting [игнор отключен] [закрыт для гостей] / WCF и типы. Странная ситуация
9 сообщений из 9, страница 1 из 1
WCF и типы. Странная ситуация
    #35250194
Фотография webus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день! Страннаю ситуацию обнаружил. Есть программа, выступающая в виде сервера. На ней крутится сервис WCF. Если объяснить точнее то задача сервера предоставить доступ к объектам. Клиент владеет только интерфейсами этих объектов.
Обращаемся к объектам с помощью класса помощника:
...
Рейтинг: 0 / 0
WCF и типы. Странная ситуация
    #35250210
Фотография webus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: 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.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
public class HDObject<T>
    {
        /// <summary>
        /// Получаем бизнес-объект
        /// </summary>
        /// <returns>данные типа object</returns>
        public object GetObject()
        {
            //net.tcp://10.0.0.193:9000/
            object o;
            o = null;

            GUICfg cfg = new GUICfg();
            if (cfg.WCFString == string.Empty) return o;

            if (typeof(T) == typeof(IHelpDeskService))
            {
                try
                {
                    ChannelFactory<IHelpDeskService> f = new ChannelFactory<IHelpDeskService>(new NetTcpBinding());
                    IHelpDeskService ro = f.CreateChannel(new EndpointAddress(cfg.WCFString + "HelpDeskService"));
                    return ro;
                }
                catch
                {
                    return o;
                }
            }
            else if (typeof(T) == typeof(IAdmAccount))
            {
                try
                {
                    ChannelFactory<IAdmAccount> f = new ChannelFactory<IAdmAccount>(new NetTcpBinding());
                    IAdmAccount ro = f.CreateChannel(new EndpointAddress(cfg.WCFString + "AdmAccount"));
                    return ro;
                }
                catch
                {
                    return o;
                }
            }
            else if (typeof(T) == typeof(IDepartamentAccount))
            {
                try
                {
                    ChannelFactory<IDepartamentAccount> f = new ChannelFactory<IDepartamentAccount>(new NetTcpBinding());
                    IDepartamentAccount ro = f.CreateChannel(new EndpointAddress(cfg.WCFString + "DepartamentAccount"));
                    return ro;
                }
                catch
                {
                    return o;
                }
            }
            else if (typeof(T) == typeof(IBusiness))
            {
                try
                {
                    ChannelFactory<IBusiness> f = new ChannelFactory<IBusiness>(new NetTcpBinding());
                    IBusiness ro = f.CreateChannel(new EndpointAddress(cfg.WCFString + "Business"));
                    return ro;
                }
                catch
                {
                    return o;
                }
            }
            else return o;
        }
    }

Получаем объект на клиента и работаем с ним так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
HDObject<IDepartamentAccount> o = new HDObject<IDepartamentAccount>();
HDObject<IBusiness> o2 = new HDObject<IBusiness>();
                    
IDepartamentAccount da = (IDepartamentAccount)o.GetObject();
IBusiness bus = (IBusiness)o2.GetObject();
                    
da.SetDepartamentName(DepNameTB.Text);
da.SetDepartamentSummary(DepSumTB.Text);

MessageBox.Show(da.GetType().ToString());

if (bus.New(da)) MessageBox.Show("ok");
else MessageBox.Show("нет ответа");

в классе наследуемом от интерфейса IBusiness делаем обработку, точнее определение типа объекта с которым будем работать

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
if (ob.GetType() == typeof(IComm::IDepartamentAccount))
            {
                //if (!isconnected) return false;
                IComm::IDepartamentAccount ro = (IComm::IDepartamentAccount)ob;
                myCommand = string.Format("SELECT dep_fun({0},{1},'A');", ro.GetDepartamentName(), ro.GetDepartamentSummary());
                myCmd.CommandType = CommandType.StoredProcedure;
                Init();
                myCmd.ExecuteNonQuery();
                return true;
            }
            else return false;

на входе получаем тип System.Object, по этому последний листинг не отрабатывает.

Возникает вопрос. Разве при работе с объектами через WCF пропадают типы ?
...
Рейтинг: 0 / 0
WCF и типы. Странная ситуация
    #35250229
SerP1983
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а так?
Код: plaintext
1.
if (ob is IComm::IDepartamentAccount)
...
Рейтинг: 0 / 0
WCF и типы. Странная ситуация
    #35250235
Фотография bured
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как думаете DataContract для чего придумали?
...
Рейтинг: 0 / 0
WCF и типы. Странная ситуация
    #35250246
Фотография webus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SerP1983а так?
Код: plaintext
1.
if (ob is IComm::IDepartamentAccount)


пробовал. он объект ob определяет как тип System.Object :) не пойму почему
...
Рейтинг: 0 / 0
WCF и типы. Странная ситуация
    #35250257
Фотография webus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот в этому участке кодя ясно видно:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
HDObject<IDepartamentAccount> o = new HDObject<IDepartamentAccount>();
                    HDObject<IBusiness> o2 = new HDObject<IBusiness>();
                    
                    IDepartamentAccount da = (IDepartamentAccount)o.GetObject();
                    IBusiness bus = (IBusiness)o2.GetObject();
                    
                    da.SetDepartamentName(DepNameTB.Text);
                    da.SetDepartamentSummary(DepSumTB.Text);

                    MessageBox.Show(da.GetType().ToString());

                    if (bus.New(da)) MessageBox.Show("ok");
                    else MessageBox.Show("фигня");
что da имеет тип IDepartamentAccount. а на сервере когда он возвращается через WCF определяется как System.Object.
Можно канечно искать объекты методом принудительного преобразования и отлавливать через исключения типа того:
Код: plaintext
1.
2.
3.
4.
5.
6.
try {
        IDepartamentAccount x = (IDepartamentAccount)ob;
}
catch {
   //видимо не тот
}
но это какой-то не удачный способ
...
Рейтинг: 0 / 0
WCF и типы. Странная ситуация
    #35250297
Фотография webus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть какие нить идеи ?
...
Рейтинг: 0 / 0
WCF и типы. Странная ситуация
    #35250383
Volhv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
webusЕсть какие нить идеи ?

у вас всегда есть каморка - через которую можно сделать все что угодно

Код: plaintext
if (ob.GetType().ToString() == "...")
...
Рейтинг: 0 / 0
WCF и типы. Странная ситуация
    #35250392
Фотография Нахлобуч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
webusЕсть какие нить идеи ?
Для начала познать "Первое правило построения распределенных систем".
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / WCF, Web Services, Remoting [игнор отключен] [закрыт для гостей] / WCF и типы. Странная ситуация
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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