【问题标题】:Is there a size limit on a WCF WebInvoke Response?WCF WebInvoke 响应是否有大小限制?
【发布时间】:2010-07-15 19:31:27
【问题描述】:

我有一个如下定义的 WCF Web 服务

[OperationContract]
[WebInvoke(
    Method = "GET",
    ResponseFormat = WebMessageFormat.Json,
    BodyStyle = WebMessageBodyStyle.Bare,
    UriTemplate = "Assets/{assetId}/Reports/{startDate}/{endDate}")]
JQGridDataStore<Report> GetReportsForAssetFilterByDate(string assetId, string startDate, string endDate);

当我的 JQGridDataStore 包含数千个 Report 实例时,我可以轻松获得响应。但是,数据存储超过 10,000 个报告,我在浏览器中看到以下内容:

错误 324 (net::ERR_EMPTY_RESPONSE):未知错误。

我逐步完成了服务的实现,我可以看到它毫无例外地逐步完成。 JQGridDataStore 对象已完全创建并填充了我的 10,000 + Report 实例。但是,当我按“F10”返回时,浏览器显示一个空响应。这一切都发生在一秒钟之内,所以我认为我没有遇到任何超时。

基于此,我认为我遇到了某种类型的缓冲区大小限制。有哪些限制,我将如何调整它们?

【问题讨论】:

  • 我建议在 svcconfigeditor 中加载您的服务配置,然后查看并增加各种限制

标签: c# wcf json rest


【解决方案1】:

您可能遇到了 DataContractJsonSerializer 的 MaxItemsInObjectGraph 配额(每个单独的对象 - 如果您的数组中有几个复杂类型,其中 10k 很容易达到此限制)。您可以在 this 之类的行为配置中进行设置。

也就是说,我建议您研究一个分页隐喻。没有人愿意等待所有这些东西一口气下来。 :)

【讨论】:

  • 同意,一次 10,000 多份报告对我们的客户来说毫无用处,所以我也在做分页。
【解决方案2】:

在您的客户端 web.config 中,您可以通过设置绑定的 maxReceivedMessageSize 属性来设置服务可以接收的最大大小:

<bindings>
  <webHttpBinding>
    <binding name="myWebHttpBinding" maxReceivedMessageSize="2000000" maxBufferSize="2000000">
    </binding>
  </webHttpBinding>
</bindings>

我相信这默认为 65536,所以如果您的响应大于该值,那可能是您的麻烦。

希望这会有所帮助!

【讨论】:

  • 这是 WCF 客户端设置 - 他的客户端是浏览器。
  • 您的回答解决了我的问题。 maxReceivedMessageSize 是请求的限制,而不是响应的限制。所以这可能对 JadeMason 没有帮助。
猜你喜欢
  • 1970-01-01
  • 2020-11-02
  • 1970-01-01
  • 1970-01-01
  • 2013-02-23
  • 1970-01-01
  • 2011-07-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多