J'ai un modèle de données Entity Framework. Une partie du modèle est une entité client. Le service Web fournit une méthode pour obtenir un client et pour recevoir une version mise à jour de ce client à persister. Pour tester cela, j'ai créé un nouveau site Web ASP.NET Application, (Solution> Ajouter> Nouveau projet> Application Web ASP.NET), puis ajouté une référence à ma référence de service à l'aide de la boîte de dialogue standard Ajouter une référence de service . J'appelle alors le service en utilisant le code suivant:"L'objet EntityReference n'a pas pu être sérialisé" lors de la sérialisation à partir d'un site Web ASP.NET, mais fonctionne correctement sur une application Web ASP.NET
var client = new CustomerServiceClient();
var customer = client.GetCustomerByID(18); // get it
customer.LimitDown = 100; // change it
client.SaveCustomer(customer); // persist it
Tout fonctionne comme prévu.
Maintenant, je fais exactement la même chose, mais cette fois avec ASP.NET Web Site (Solution> Ajouter> Nouveau site Web> Site Web ASP.NET). J'ajoute la référence d'une manière similaire et copiez et collez le code ci-dessus dans le nouveau site. Mais maintenant je reçois l'exception suivante lancée sur la 4ème ligne:
System.InvalidOperationException The EntityReference object could not be serialized. This type of object cannot be serialized when the RelationshipManager belongs to an entity object that does not implement IEntityWithRelationships.
Source Error:
Line 2474: Line 2475:
public SkyWalkerCustomerService.OperationResult SaveCustomer(SkyWalkerCustomerService.Customer customer) { Line 2476:
return base.Channel.SaveCustomer(customer); Line 2477: } Line 2478: }Stack Trace:
System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(IMessage reqMsg, IMessage retMsg) +9475203
System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData& msgData, Int32 type) +345
SkyWalkerCustomerService.ICustomerService.SaveCustomer(Customer customer) +0
SkyWalkerCustomerService.CustomerServiceClient.SaveCustomer(Customer customer) in c:\Windows\Microsoft.NET\Framework\v4.0.30128\Temporary ASP.NET Files\testsite2\dd2bcf8d\f95604ff\App_WebReferences.fz4h7x7l.0.cs:2476 _Default.Page_Load(Object sender, EventArgs e) in c:\Users\Mike\Documents\Repositories\UWC\SkyWalker\TestSite2\Default.aspx.cs:17 System.Web.Util.CalliHelper.EventArgFunctionCaller(IntPtr fp, Object o, Object t, EventArgs e) +14 System.Web.Util.CalliEventHandlerDelegateProxy.Callback(Object sender, EventArgs e) +35
System.Web.UI.Control.OnLoad(EventArgs e) +91
System.Web.UI.Control.LoadRecursive() +61 System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +1966
La recherche de cette erreur retourne très peu. Pourquoi ça ne marche pas? Je suppose qu'une réponse serait d'utiliser une application web au lieu d'un site Web, mais j'ai un grand site existant auquel j'ai besoin d'ajouter la référence du service, et je préfère ne pas le convertir.
Avez-vous vérifié votre configuration de référence de service pour vous assurer que vous réutilisez la bibliothèque d'assemblage de référence? Cette erreur peut être due à la différence entre l'objet Customer généré à partir de MetatData de la référence de service et non l'objet client "réel" (c'est-à-dire l'objet de modèle d'entité). –
Par défaut, la case "Réutiliser les types dans les assemblages référencés" est cochée, et je n'ai pas changé cela dans ma référence. MAIS, l'assemblage contenant mon objet client EF n'est de toute façon pas partagé - il réside sur le serveur, et je veux seulement que mon client soit conscient du service WCF, pas de l'assemblage EF. Et même si c'était le problème, cela ne répondrait pas à la question - pourquoi cela fonctionne-t-il à partir d'une application web, mais pas d'un site web? J'ai même essayé de copier l'ensemble du dossier Références de service de l'application de travail vers le site qui ne fonctionne pas, et l'erreur est restée. C'est insensé! –