gpt4 book ai didi

.net - 循环引用和 WCF

转载 作者:行者123 更新时间:2023-12-03 21:35:38 26 4
gpt4 key购买 nike

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

现在,当我将 poco 实体返回给我的客户端时,我收到一条错误消息“底层连接已关闭”我启用了 WCF 跟踪并找到了确切的错误: 如果禁用引用跟踪,则包含循环且无法序列化。

我查看了 MSDN 并找到了诸如在 DataContract 方法属性中设置 IsReference=true 之类的解决方案,但我没有用 DataContracts 装饰我的 POCO 类,我认为也不需要它。如果我用 DataContract 属性装饰一个类,我不会将其称为 POCO

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

最佳答案

您已经提到了该方法,但我使用此属性

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
}

}
...以及对服务操作的引用,例如;
[OperationContract]
[ReferencePreservingDataContractFormat]
IList<SomeObject> Search(string searchString);

仅供引用 - 想在到期时给予信用,但没有记录我最初看到上述方法的位置。

编辑:

我相信代码的来源来自这个 blog post .

关于.net - 循环引用和 WCF,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4967603/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com