我有一个访问WCF服务的Silverlight 3 UI,后者又访问使用NHibernate的存储库。为了克服WCF的一些NHibernate延迟加载问题我正在使用我自己的DataContract代理,如下所述:http://timvasil.com/blog14/post/2008/02/WCF-serialization-with-NHibernate.aspx。在这里我设置了preserveObjectReferences = true
我的模型包含周期(即带有IList [订单]的客户)
当我从我的服务中检索一个对象时,它工作正常,但是当我尝试将同一个对象发送回wcf服务时,我收到错误:
System.ServiceModel.CommunicationException 用户代码未处理 消息=同时出错 试图序列化参数 http://tempuri.org/:searchCriteria。 InnerException消息是'Object 图...'包含周期而不能 如果引用不是序列化的 跟踪。考虑使用 DataContractAttribute与 IsReference属性设置为true。'
因此,循环引用现在是Silverlight中的一个问题,所以我尝试将我的DataContract更改为[DataContract(IsReference = true)]但是现在当我尝试从我的服务中检索一个对象时,我得到以下异常:
System.ExecutionEngineException未处理Message = Exception of 输入'System.ExecutionEngineException' 被扔了。的InnerException:
有什么想法吗?
答案 0 :(得分:1)
这是.Net 3.5中的Silverlight 3和WCF中的一个错误。
我现在已升级到.Net 4和Silverlight 4,所有内容(来自WCF的循环引用和返回接口类型)都可以很好地协同工作!
答案 1 :(得分:0)
您是否在客户端和服务器上都使用IsReference = true?
James Kovacs解决了这个问题,我将在这里发布链接:
这是更好的解决方案:
要为操作或服务范围启用循环引用,您可以使用自定义行为等。基本上,您需要能够挂钩到序列化程序实例化过程并使用上面的重载创建实例:
Subclass DataContractSerializerOperationBehavior
Ovverride CreateSerializer方法
创建一个新的DCS实例,将true传递给preserveObjectReferences参数。
来自Here