edit: Comme mentionné dans mon commentaire, j'ai découvert que la raison de ce problème était que l'objet Module a une référence à l'objet OrderInfo. DataContractSerializer ne prend pas en charge la préservation des références d'objet par défaut. J'ai maintenant réussi à faire fonctionner tout cela correctement. Si quelqu'un est intéressé, contactez-moi et je l'ajouterai dans une réponse ici.Problème de préservation des références d'objet bidirectionnel dans WCF. Message d'erreur: "La connexion sous-jacente a été fermée: La connexion a été fermée de façon inattendue."
- .net sert au client .net avec la bibliothèque POCO (objets de données) partagée aux deux extrémités.
- Objet OrderInfo contient une liste. Si la liste contient des objets de module, je suis redouté "La connexion sous-jacente était fermée: la connexion a été fermée de manière inattendue."
- Je peux envoyer une liste "autonome" à partir d'une autre méthode de service et cela fonctionne très bien afin que les objets Module sérialisent/désérialisent correctement. .
Je ne me DataContract dans les classes POCO, WCF gère cela automatiquement (qui pourrait aussi être le problème que je l'ai essayé d'ajouter:
[Serializable] [XmlInclude(typeof(List<Module>))]
mais cela n'a pas aidé. Je ne vois pas quel est le problème que je fais la même chose EXACT dans l'objet du module retournant une collection d'objets 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;
}
}
}
appel code client est:.
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);
}
Il échoue sur la dernière ligne lorsque je demande l'objet OrderInfo du service. Tous les appels ci-dessus fonctionnent très bien.
J'ai réussi à comprendre que cela se produit parce que l'objet Module a une référence "retour" à l'objet OrderInfo parent. J'ai essayé d'activer "PreserveObjectReferences" dans un DataContractSerializerOperationBehavior personnalisé comme indiqué à la fin de cet article: http: //www.zamd.net/2008/05/20/DataContractSerializerAndIsReferenceProperty.aspx Mais je ne pouvais pas le faire fonctionner et j'ai abandonné pour le moment. Je ne voulais pas utiliser d'attributs dans mes classes POCO mais je pourrais donner un coup avec le [DataContract (IsReference = true)] sur mes classes. Je crois que l'équipe de la WCF devrait faciliter cela! – Trygve
oui, c'est à peu près mon problème en ce moment aussi. Ne pas marquer les classes POCO avec quelque chose, mais la façon dont Entity Framework charge les propriétés de navigation, je ne peux tout simplement pas échapper à essayer de sérialiser une référence circulaire. J'ai posté une question ici: http://stackoverflow.com/questions/2915181/ef4-poco-wcf-serialization-problems-no-lazy-loading-proxy-no-proxy-circular-re – kdawg