Редактировать: Как уже упоминалось в моем комментарии, я выяснил, почему эта проблема связана с тем, что объект модуля ссылается на объект OrderInfo. DataContractSerializer не поддерживает сохранение ссылок на объекты по умолчанию. Теперь я смог заставить все это работать правильно. Если кто-то заинтересован, свяжитесь со мной, и я добавлю его в ответ здесь.Проблема сохранения двухсторонних ссылок объектов в WCF. Сообщение об ошибке: «Основное соединение было закрыто: соединение было неожиданно закрыто».
- .net сервис .net-клиенту с общей библиотекой POCO (объекты данных) на обоих концах.
- Объект OrderInfo содержит список. Если в списке содержатся объекты модуля, я получаю страшное «Основное соединение было закрыто: соединение было неожиданно закрыто».
- Я могу отправить «автономный» список из другого метода службы, и он отлично работает, поэтому модуль сам по себе сериализует/десериализует штраф. .
Я не использую DataContract в классах POCO, WCF обрабатывает это автоматически (который также может быть проблема, которую я пытался добавить:
[Serializable] [XmlInclude(typeof(List<Module>))]
, но это не помогло. Я не вижу, в чем проблема, так как я делаю одно и то же в объекте модуля возвращает коллекцию объектов Pricemodel
public class OrderInfo
{
int _ProductID;
IList<Module> _Modules = new List<Module>();
//IList<MiscProduct> _MiscProduct = new List<MiscProduct>();
public IList<Module> Modules
{
get
{
return new List<Module>(_Modules).AsReadOnly();
}
set
{
_Modules = value;
}
}
}
public class Module
{
string _Name;
int _Sort_Number;
string _Description;
OrderInfo _OrderInfoMaster;
IList<Pricemodel> _Pricemodels = new List<Pricemodel>();
public IList<Pricemodel> Pricemodels
{
get
{
return new List<Pricemodel>(_Pricemodels).AsReadOnly();
}
set
{
_Pricemodels = value;
}
}
}
телефонный код клиента:.
using (ProductOrderItems_WCFService.ProductOrderServiceClient client = new ProductOrderItems_WCFService.ProductOrderServiceClient())
{
string s = client.HelloWorld();
Module m = client.GetModule();
List<Module> mods = client.GetModuleList(7);
grdModules.DataSource = mods;
grdModules.DataBind();
OrderInfo oi = client.GetOrderInfo(7);
}
Он не работает в последней строке, когда я запрашиваю объект OrderInfo из службы. Все вышеперечисленные вызовы отлично работают.
Мне удалось выяснить, что это происходит потому, что объект модуля имеет ссылку «назад» на родительский объект OrderInfo. Я попытался включить «PreserveObjectReferences» в пользовательском DataContractSerializerOperationBehavior, как описано в конце этой статьи: http: //www.zamd.net/2008/05/20/DataContractSerializerAndIsReferenceProperty.aspx Но я не мог заставить его работать и на данный момент отказался. Я не хотел использовать какие-либо атрибуты в своих классах POCO, но я мог бы дать этот снимок с помощью [DataContract (IsReference = true)] на моих классах. Я считаю, что команда WCF должна сделать это проще! – Trygve
Да, это в значительной степени моя проблема прямо сейчас. Не выделяйте классы POCO ничем, но способ, которым Entity Framework загружает свойства навигации, я просто не могу уйти от попытки сериализации циклической ссылки. Я поставил вопрос здесь: http://stackoverflow.com/questions/2915181/ef4-poco-wcf-serialization-problems-no-lazy-loading-proxy-no-proxy-circular-re – kdawg