Доброго времени суток!
Помогите плз с направлением копания.
Клиентский код:
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, а напрямую лезть в базу — выполняется мигом. И клиент и сервер на одной машине. Вероятно какая то проблема при упаковке и отправке. Помогите плз.
Здравствуйте, zipp, Вы писали:
Z>Метод Ping отрабатывает на ура. При вызове GetNotSentGoods таймаут эксепшен (выполняется больше минуты). Если не использовать WCF, а напрямую лезть в базу — выполняется мигом. И клиент и сервер на одной машине. Вероятно какая то проблема при упаковке и отправке. Помогите плз.
Вероятно сервер дохнет при попытке сериализовать все соотв. Order'ы с соотв. им Product'ами. Product, вероятно,
тоже может что-нибудь тянуть и т.д., т.е. одно тянет другое. Также можно поиграться со всякими лимитами и настройками на отдаваемые сообщения. Типа того.
Здравствуйте, Слава, Вы писали:
С>А класс DbOrder и его поля/свойства помечены атрибутами DataContract?
Да, помечены, они сгенерены по БД — там везде ставится DataContract
С>Вообще, лучше бы завести на каждый класс сущности из базы свой класс чего-то-тамDTO и сделать мапперы — из сущностей в DTO и обратный.
Просто зачет тогда эти автогенереные классы, если по сети нормально не передаются( Там сложная структура, дублировать ее очень не хочется. Но есть подозрение, что придется.
Здравствуйте, zipp, Вы писали:
Z>Убрал из конфига <reliableSession enabled="true" inactivityTimeout="04:00:00"/> , теперь выдает "Удаленный хост принудительно разорвал существующее подключение" при вызове GetNotSentGoods
Можно добавить в конфиги параметры, которые включают трассировку вызовов. А затем смотреть журналы трассировки специальной утилитой. Другое дело, что пользы от этого будет не столь много, журнал очень многословный, сам WCF может поломаться из-за множества причин, например, two-way вызов из UI-треда. Или попытка обратиться к сервису прямо из коллбэка на клиенте.
Выкладывай сюда интерфейс сервера, а также конфиги сервера и клиента.
Здравствуйте, Слава, Вы писали:
С>Можно добавить в конфиги параметры, которые включают трассировку вызовов. А затем смотреть журналы трассировки специальной утилитой. Другое дело, что пользы от этого будет не столь много, журнал очень многословный, сам WCF может поломаться из-за множества причин, например, two-way вызов из UI-треда. Или попытка обратиться к сервису прямо из коллбэка на клиенте.
С>Выкладывай сюда интерфейс сервера, а также конфиги сервера и клиента.
Да, спасибо! Добавление логов диагностики помогло. Ошибка на сервере заключалась в том, что при сериализации пытался отправить инстанс контекста (на него есть ссылка в обхекте DbOrder), а обращаться к этому контексту нальзя, так как он уже задиспоужен. В общем — нужно было выключить LazyLoad у контекста и все заработало!