【问题标题】:Silverlight WCF serialization DataContract(IsReference=true) problemSilverlight WCF 序列化 DataContract(IsReference=true) 问题
【发布时间】:2010-04-21 11:12:52
【问题描述】:

我有一个 Silverlight 3 UI,它可以访问 WCF 服务,而这些服务又可以访问使用 NHibernate 的存储库。为了克服 WCF 的一些 NHibernate 延迟加载问题,我使用了我自己的 DataContract 代理,如下所述:http://timvasil.com/blog14/post/2008/02/WCF-serialization-with-NHibernate.aspx。在这里我设置了 preserveObjectReferences = true

我的模型包含循环(即具有 IList[Order] 的客户)

当我从我的服务中检索一个对象时,它工作正常,但是当我尝试将同一个对象发送回 wcf 服务时,我得到了错误:

System.ServiceModel.CommunicationException 未被用户代码处理 消息=有一个错误,而 试图序列化参数 http://tempuri.org/:searchCriteria。 InnerException 消息是“对象 graph ...' 包含循环并且不能 如果引用不被序列化 跟踪。考虑使用 DataContractAttribute 与 IsReference 属性设置为 true。'

所以循环引用现在是 Silverlight 中的一个问题,所以我尝试将我的 DataContract 更改为 [DataContract(IsReference=true)] 但现在当我尝试从我的服务中检索对象时出现以下异常:

System.ExecutionEngineException 未处理 Message=Exception of 输入“System.ExecutionEngineException” 被抛出。内部异常:

有什么想法吗?

【问题讨论】:

    标签: wcf silverlight serialization datacontract


    【解决方案1】:

    这是 Silverlight 3 和 .Net 3.5 中的 WCF 中的一个错误。

    我现在已经升级到 .Net 4 和 Silverlight 4,一切(循环引用和从 WCF 返回的接口类型)都可以很好地协同工作!

    【讨论】:

      【解决方案2】:

      您是否在客户端和服务器上都使用了 IsReference=true ?

      James Kovacs 解决了这个问题,我将在此处发布链接:

      One Option

      这是更好的解决方案:

      要启用操作或服务范围的循环引用,您可以使用自定义行为等。本质上,您需要能够挂钩到序列化程序实例化过程并使用上述重载创建实例:

      1. 子类 DataContractSerializerOperationBehavior

      2. 覆盖 CreateSerializer 方法

      3. 创建一个新的 DCS 实例,将 true 传递给 preserveObjectReferences 参数。

      来自Here

      【讨论】:

      • 我的数据合同在客户端和服务器之间共享,所以是的 IsReference=true 两者都存在。我已经在服务器端应用了自定义行为并设置了 preserveObjectReferences=true。但是在 Silverlight 3 中,无法设置 preserveObjectReferences=true (没有构造函数重载并且有一个私有设置器)。它可能与此错误(connect.microsoft.com/VisualStudio/feedback/details/391260/…)有关,该错误已在 .net 4.0 中修复,但由于依赖关系,我不确定是否可以升级到 SL 4
      • 注意:从 wcf 服务获取对象时不会发生此错误,而是在从 silverlight 客户端通过服务发送以前检索到的对象时发生此错误
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-06-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-08
      相关资源
      最近更新 更多