Гость
Форумы / WCF, Web Services, Remoting [игнор отключен] [закрыт для гостей] / WCF и типы. Странная ситуация / 9 сообщений из 9, страница 1 из 1
11.04.2008, 15:42
    #35250194
webus
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
WCF и типы. Странная ситуация
Добрый день! Страннаю ситуацию обнаружил. Есть программа, выступающая в виде сервера. На ней крутится сервис WCF. Если объяснить точнее то задача сервера предоставить доступ к объектам. Клиент владеет только интерфейсами этих объектов.
Обращаемся к объектам с помощью класса помощника:
...
Рейтинг: 0 / 0
11.04.2008, 15:47
    #35250210
webus
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
WCF и типы. Странная ситуация
Код: 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
11.04.2008, 15:51
    #35250229
SerP1983
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
WCF и типы. Странная ситуация
а так?
Код: plaintext
1.
if (ob is IComm::IDepartamentAccount)
...
Рейтинг: 0 / 0
11.04.2008, 15:53
    #35250235
bured
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
WCF и типы. Странная ситуация
Как думаете DataContract для чего придумали?
...
Рейтинг: 0 / 0
11.04.2008, 15:55
    #35250246
webus
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
WCF и типы. Странная ситуация
SerP1983а так?
Код: plaintext
1.
if (ob is IComm::IDepartamentAccount)


пробовал. он объект ob определяет как тип System.Object :) не пойму почему
...
Рейтинг: 0 / 0
11.04.2008, 16:00
    #35250257
webus
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
WCF и типы. Странная ситуация
Вот в этому участке кодя ясно видно:
Код: 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
11.04.2008, 16:09
    #35250297
webus
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
WCF и типы. Странная ситуация
Есть какие нить идеи ?
...
Рейтинг: 0 / 0
11.04.2008, 16:33
    #35250383
Volhv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
WCF и типы. Странная ситуация
webusЕсть какие нить идеи ?

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

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


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