WCF + Entity
От: zipp  
Дата: 25.02.15 07:20
Оценка: :)
Доброго времени суток!
Помогите плз с направлением копания.

Клиентский код:

            var service = ServiceFactory.GetDataService();
            var ping = service.Ping();
            var notSentOrders = service.GetNotSentGoods();



Серверный код:

public string Ping()
        {
            using (var entity = new u351016_landingEntities())
            {
                return entity.Order.FirstOrDefault().OrderId.ToString();
            }
        }

public DbOrder[] GetNotSentGoods()
        {
            using (var entity = new u351016_landingEntities())
            {
                var orders = entity.Order.Include("ProductSet.Product1").Where(o => o.Status == Constants.ToBeProcessedOrderStatusId || o.Status == Constants.ToBeDeliveredOrderStatusId).ToArray();

                return orders;
            }
        }



Метод Ping отрабатывает на ура. При вызове GetNotSentGoods таймаут эксепшен (выполняется больше минуты). Если не использовать WCF, а напрямую лезть в базу — выполняется мигом. И клиент и сервер на одной машине. Вероятно какая то проблема при упаковке и отправке. Помогите плз.
Отредактировано 25.02.2015 7:21 zipp . Предыдущая версия .
wcf
Re: WCF + Entity
От: Sharov Россия  
Дата: 25.02.15 07:49
Оценка:
Здравствуйте, zipp, Вы писали:

Z>Метод Ping отрабатывает на ура. При вызове GetNotSentGoods таймаут эксепшен (выполняется больше минуты). Если не использовать WCF, а напрямую лезть в базу — выполняется мигом. И клиент и сервер на одной машине. Вероятно какая то проблема при упаковке и отправке. Помогите плз.


Вероятно сервер дохнет при попытке сериализовать все соотв. Order'ы с соотв. им Product'ами. Product, вероятно,
тоже может что-нибудь тянуть и т.д., т.е. одно тянет другое. Также можно поиграться со всякими лимитами и настройками на отдаваемые сообщения. Типа того.
Кодом людям нужно помогать!
Re: WCF + Entity
От: Слава  
Дата: 25.02.15 09:49
Оценка: 1 (1)
Здравствуйте, zipp, Вы писали:

Z>public DbOrder[] GetNotSentGoods()


А класс DbOrder и его поля/свойства помечены атрибутами DataContract?

Вообще, лучше бы завести на каждый класс сущности из базы свой класс чего-то-тамDTO и сделать мапперы — из сущностей в DTO и обратный.
Re[2]: WCF + Entity
От: zipp  
Дата: 25.02.15 09:54
Оценка:
Здравствуйте, Слава, Вы писали:

С>А класс DbOrder и его поля/свойства помечены атрибутами DataContract?


Да, помечены, они сгенерены по БД — там везде ставится DataContract

С>Вообще, лучше бы завести на каждый класс сущности из базы свой класс чего-то-тамDTO и сделать мапперы — из сущностей в DTO и обратный.


Просто зачет тогда эти автогенереные классы, если по сети нормально не передаются( Там сложная структура, дублировать ее очень не хочется. Но есть подозрение, что придется.

Кто-нибудь передавал Entity объекты по WCF?
Re: WCF + Entity
От: zipp  
Дата: 25.02.15 10:21
Оценка:
Убрал из конфига <reliableSession enabled="true" inactivityTimeout="04:00:00"/> , теперь выдает "Удаленный хост принудительно разорвал существующее подключение" при вызове GetNotSentGoods
Re[2]: WCF + Entity
От: Sharov Россия  
Дата: 25.02.15 10:38
Оценка:
Здравствуйте, zipp, Вы писали:

Z>Убрал из конфига <reliableSession enabled="true" inactivityTimeout="04:00:00"/> , теперь выдает "Удаленный хост принудительно разорвал существующее подключение" при вызове GetNotSentGoods


Что wcf-ный лог сервера выдает?
Кодом людям нужно помогать!
Re[2]: WCF + Entity
От: Слава  
Дата: 25.02.15 10:42
Оценка:
Здравствуйте, zipp, Вы писали:

Z>Убрал из конфига <reliableSession enabled="true" inactivityTimeout="04:00:00"/> , теперь выдает "Удаленный хост принудительно разорвал существующее подключение" при вызове GetNotSentGoods


Можно добавить в конфиги параметры, которые включают трассировку вызовов. А затем смотреть журналы трассировки специальной утилитой. Другое дело, что пользы от этого будет не столь много, журнал очень многословный, сам WCF может поломаться из-за множества причин, например, two-way вызов из UI-треда. Или попытка обратиться к сервису прямо из коллбэка на клиенте.

Выкладывай сюда интерфейс сервера, а также конфиги сервера и клиента.
Re[3]: WCF + Entity
От: zipp  
Дата: 25.02.15 10:55
Оценка: :)
Здравствуйте, Слава, Вы писали:

С>Можно добавить в конфиги параметры, которые включают трассировку вызовов. А затем смотреть журналы трассировки специальной утилитой. Другое дело, что пользы от этого будет не столь много, журнал очень многословный, сам WCF может поломаться из-за множества причин, например, two-way вызов из UI-треда. Или попытка обратиться к сервису прямо из коллбэка на клиенте.


С>Выкладывай сюда интерфейс сервера, а также конфиги сервера и клиента.



Да, спасибо! Добавление логов диагностики помогло. Ошибка на сервере заключалась в том, что при сериализации пытался отправить инстанс контекста (на него есть ссылка в обхекте DbOrder), а обращаться к этому контексту нальзя, так как он уже задиспоужен. В общем — нужно было выключить LazyLoad у контекста и все заработало!
Отредактировано 25.02.2015 11:01 zipp . Предыдущая версия .
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.