从 ASP.NET 网站序列化时“无法序列化 EntityReference 对象”,但在 ASP.NET Web 应用程序上工作正常

Posted

技术标签:

【中文标题】从 ASP.NET 网站序列化时“无法序列化 EntityReference 对象”,但在 ASP.NET Web 应用程序上工作正常【英文标题】:"The EntityReference object could not be serialized" when serializing from an ASP.NET Web Site, but works OK on an ASP.NET Web Application 【发布时间】:2011-01-30 04:57:34 【问题描述】:

我有一个实体框架数据模型。模型的一部分是客户实体。 Web 服务提供了一种方法来获取客户,并接收该客户的更新版本以进行持久化。

为了测试这一点,我创建了一个新的 ASP.NET Web 应用程序,(解决方案 > 添加 > 新项目 > ASP.NET Web 应用程序),然后使用标准添加对我的服务引用的引用添加服务参考对话框。然后我使用以下代码调用该服务:

var client = new CustomerServiceClient();
var customer = client.GetCustomerByID(18); // get it
customer.LimitDown = 100; // change it
client.SaveCustomer(customer); // persist it

一切都按预期进行。

现在,我做同样的事情,但这次使用 ASP.NET Web Site(解决方案 > 添加 > 新网站 > ASP.NET 网站)。我以类似的方式添加引用并将上面的代码复制并粘贴到新站点中。但是现在我在第 4 行抛出了以下异常:

System.InvalidOperationException EntityReference 对象不能是 序列化。这种类型的物体不能 被序列化时 关系管理器属于 未实现的实体对象 IEntityWithRelationships。

来源错误:

第 2474 行:第 2475 行: 民众 SkyWalkerCustomerService.OperationResult SaveCustomer(SkyWalkerCustomerService.Customer 客户) 第 2476 行: 返回 base.Channel.SaveCustomer(客户); 第 2477 行: 第 2478 行:

堆栈跟踪:

System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(IMessage reqMsg, IMessage retMsg) +9475203 System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(消息数据& msgData,Int32 类型)+345 SkyWalkerCustomerService.ICustomerService.SaveCustomer(客户 客户)+0 SkyWalkerCustomerService.CustomerServiceClient.SaveCustomer(客户 客户)在 c:\Windows\Microsoft.NET\Framework\v4.0.30128\Temporary ASP.NET 文件\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, 对象 o, 对象 t, EventArgs e) +14 System.Web.Util.CalliEventHandlerDelegateProxy.Callback(对象 发件人,EventArgs e) +35 System.Web.UI.Control.OnLoad(EventArgs e) +91 System.Web.UI.Control.LoadRecursive() +61 System.Web.UI.Page.ProcessRequestMain(布尔值 includeStagesBeforeAsyncPoint,布尔值 includeStagesAfterAsyncPoint) +1966

谷歌搜索这个错误返回的很少。为什么这不起作用?

我想一个答案是使用 Web 应用程序而不是网站,但我有一个大型现有网站,我需要向其中添加服务引用,我宁愿不转换它。

【问题讨论】:

您是否检查了服务参考配置以确保您正在重新使用参考程序集库?此错误可能是由 Service Reference 的 MetatData 生成的 Customer 对象的差异引起的,而不是“真实”的 Customer 对象(即实体模型对象)。 默认情况下,“在引用的程序集中重用类型”框被选中,我没有在我的引用中更改它。但是,包含我的 EF 客户对象的程序集无论如何都不会共享 - 它存在于服务器上,我只希望我的客户端知道 WCF 服务,而不是 EF 程序集。即使这是问题所在,它也不会回答这个问题——为什么这在网络应用程序上有效,而不是在网站上?我什至尝试将整个服务引用文件夹从工作应用程序复制到非工作站点,但错误仍然存​​在。这太疯狂了! 【参考方案1】:

原因

旧版本实体框架使用EntityObject、EntityReference等,如果相关实体一起返回,WCF无法序列化。

比如说,如果 WCF 方法返回一个带有购买项目的客户,它就会失败。

修复

当我们向使用旧实体框架的 WCF 端点添加服务引用时,在数据类型中,不要选择在所有引用的程序集中重用类型。但是选择在指定的引用程序集中重用类型并确保System.Data.Entity没有被选中。

【讨论】:

【参考方案2】:

临时解决方法 - 我将网站的 .NET Framework 版本更改为 3.5,现在它可以正常工作了。这对我的项目来说很好,但我想知道为什么会出现原始问题以供将来参考。

【讨论】:

我也有同样的问题。如果我发送到 WCF 的对象不包含任何关系...一切正常...但如果有一个属性引用另一个对象,则会发生相同的异常。与您不同,我无法将框架版本更改为 3.4!

以上是关于从 ASP.NET 网站序列化时“无法序列化 EntityReference 对象”,但在 ASP.NET Web 应用程序上工作正常的主要内容,如果未能解决你的问题,请参考以下文章

如何从 ASP.NET 中的 json 反序列化基本类型(System.Runtime.Serialization.Json)

从 IIS 获取我托管的 Asp.Net 网站的运行会话计数

asp.net网站不同子域名共享session信息

从 ASP.NET 执行 SSIS 包时出错

如何从 ASP.NET 的白名单中过滤 UrlReferrer?

Asp.Net Web API 2第十三课——ASP.NET Web API中的JSON和XML序列化