【问题标题】:WCF Trying to get a collection crashes the clientWCF 尝试获取集合使客户端崩溃
【发布时间】:2011-08-10 12:06:39
【问题描述】:

我一直在使用 WCF 和 EF,但在发送集合时遇到了问题。

我正在使用由 2 个解决方案组成的游乐场,这只是我需要通过线路进行交流的最低限度。在两者之间发送字符串可以正常工作,通过客户端在数据库中添加记录也可以正常工作。但是,我的服务公开了以下合同:

[OperationContract]
IEnumerable<Company> GetAllCompanies();

在我的服务中实现,例如:

public IEnumerable<Company> GetAllCompanies()
{
    using (var ctx = new InleerAppContext())
    {
        return ctx.Company.ToList();
    }
}

没有什么不寻常的,因为发送对象似乎工作正常,我本来希望这也能工作。 但是,当从我的客户调用 GetAllCompanies() 时:

var result2 = service.GetAllCompanies();
foreach (Company c in result2)
{
    Console.WriteLine(c.Name);
}

一个 CommunicationException 被抛出:

接收到的 HTTP 响应时出错 http://localhost:8080/。这可能是由于服务端点 绑定不使用 HTTP 协议。这也可能是由于 HTTP 请求上下文被服务器中止(可能是由于 服务关闭)。有关详细信息,请参阅服务器日志。

更多信息:

在 System.Net.HttpWebRequest.GetResponse()
在 System.ServiceModel.Channels.HttpChannelFactory.HttpRequestChannel.HttpChannelRequest.WaitForReply(时间跨度 超时)

我已经在客户端和服务器上使用自定义绑定配置(双方都是 basicHttpBinding)将超时时间更改为 30 分钟:

<bindings>
  <basicHttpBinding>
    <binding name="longTimeoutBasicHttpBinding"
             receiveTimeout="00:30:00" 
             sendTimeout="00:30:00">          
    </binding>
  </basicHttpBinding> 
</bindings>

我在这里缺少什么?

【问题讨论】:

  • 如果您返回单一公司会怎样?公司有导航属性吗?公司是否包含在动态代理中?你在使用延迟加载吗?
  • 您能发送配置的端点信息吗?
  • 顺便说一句。如果您在服务上设置WCF tracing,您应该能够看到异常详细信息。
  • @Ladislav:同一家公司也会发生同样的情况。它上面有一个导航属性,它也包含在 DynamicProxy 中,看起来如此。延迟加载已启用。当我“包含”导航属性时,问题仍然存在。阅读 WCF 跟踪 atm...

标签: c# wcf entity-framework-4 client communicationexception


【解决方案1】:

您很可能在循环引用方面遇到了问题。当 WCF 尝试序列化您的 Company 实例时,它会触及每个属性,因此它会触发相关实体的延迟加载并对其进行序列化,但如果实体具有向后导航属性,它将跟随它并再次序列化公司 => 序列化程序是在无限循环中。

解决这个问题的方法只有两种:

  • 关闭延迟加载(或整个代理创建)- 使用ctx.ContextOptions。也不要加载与Include 的关系
  • Remove / solve circular dependency - 如果你也想序列化关系,这是必要的

【讨论】:

  • 再次感谢您的好回答。这两天我学到了很多。 GetCompany 看起来像:ctx.ContextOptions.ProxyCreationEnabled = false; return ctx.Company.Include("PhoneNumbers").Where(company => company.Id == id).FirstOrDefault();现在,数据可以通过线路很好地传输,包括 NavigationProerty。我不禁觉得我只是在用这种方式破解一些东西。这是一个好习惯吗?
  • 我是否应该在 WCF 环境中始终避免 PrexyCreation 并选择 DTO?由于我可以在我的模板中使用 [IgnoreDataMember] 来装饰我不需要序列化的属性,因此在此设置中如何增加 DTO 的价值?
【解决方案2】:

这通常发生在序列化程序对您的类有问题时。例如,如果公司是一个实体对象并且它试图序列化导航属性之一,那将不起作用

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-06-30
    • 1970-01-01
    • 1970-01-01
    • 2019-08-15
    • 2013-12-07
    • 1970-01-01
    • 2016-08-16
    相关资源
    最近更新 更多