1

我有一个 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 未被用户代码处理 Message=尝试序列化参数 http://tempuri.org/:searchCriteria时出错。InnerException 消息是“对象图 ...”包含循环,如果不跟踪引用,则无法序列化。考虑使用将 IsReference 属性设置为 true 的 DataContractAttribute。

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

System.ExecutionEngineException 未处理 消息=引发了“System.ExecutionEngineException”类型的异常。内部异常:

有任何想法吗?

4

2 回答 2

1

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

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

于 2010-04-23T04:46:36.567 回答
0

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

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

一种选择

这是更好的解决方案:

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

  1. 子类 DataContractSerializerOperationBehavior

  2. 覆盖 CreateSerializer 方法

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

这里

于 2010-04-21T11:25:37.030 回答