循环引用和WCF

Kun*_*pal 6 .net wcf entity entity-framework ado.net-entity-data-model

我使用POCO Generator生成了我的POCO实体,我的数据库中有超过150个表.我在包括客户端在内的所有应用层共享POCO实体.我在我的上下文中禁用了LazyLoading和ProxyCreation.我在我的数据访问和业务层之上使用WCF.

现在,当我将poco实体返回给我的客户端时,我收到错误消息" 基础连接已关闭"我启用了WCF跟踪并发现了确切的错误:包含循环,如果禁用参考跟踪,则无法序列化.

我看了MSDN,发现在DataContract方法中设置IsReference = true的解决方案,但我没有使用DataContracts来装饰我的POCO类,我认为也不需要它.如果我用DataContract属性修饰一个类,我不会将它称为POCO

然后,我找到了解决方案,例如在我的ServiceContracts上应用自定义属性[CyclicReferenceAware].这确实有效,但我想把这个问题提交给社区,看看其他人如何管理这个问题,以及为什么微软没有提供内置的支持来解决循环问题序列化POCO类时的引用

Chr*_*oph 7

您已经提到了这种方法,但我使用了这个属性

public class ReferencePreservingDataContractFormatAttribute : Attribute, IOperationBehavior
    {
        #region IOperationBehavior Members
        public void AddBindingParameters(OperationDescription description, BindingParameterCollection parameters)
        {
        }

        public void ApplyClientBehavior(OperationDescription description, System.ServiceModel.Dispatcher.ClientOperation proxy)
        {
            IOperationBehavior innerBehavior = new ReferencePreservingDataContractSerializerOperationBehavior(description);
            innerBehavior.ApplyClientBehavior(description, proxy);
        }

        public void ApplyDispatchBehavior(OperationDescription description, System.ServiceModel.Dispatcher.DispatchOperation dispatch)
        {
            IOperationBehavior innerBehavior = new ReferencePreservingDataContractSerializerOperationBehavior(description);
            innerBehavior.ApplyDispatchBehavior(description, dispatch);
        }


        public void Validate(OperationDescription description)
        {
        }
    #endregion
}
Run Code Online (Sandbox Code Playgroud)

} ...以及对服务的操作的引用,如此;

[OperationContract]
[ReferencePreservingDataContractFormat]
IList<SomeObject> Search(string searchString);
Run Code Online (Sandbox Code Playgroud)

仅供参考 - 希望在应有的地方给予信任,但没有记录我最初看到上述方法的地方.

编辑:

我相信代码的来源是来自这篇博文.