【问题标题】:HttpListener response flushes to soon for 'large' buffers对于“大”缓冲区,HttpListener 响应很快就会刷新
【发布时间】:2011-07-11 00:26:32
【问题描述】:

我有一个使用 Topshelf 运行的服务,它查询专有 CRM 系统的数据。此服务为此 CRM 系统提供 REST 前端。一切正常,我收到 JSON 格式的回复。

我有一个特定的查询,它返回一个将近 500KB 的 JSON 响应。这适用于本地 Intranet 中的计算机,但是当使用 VPN 连接时,连接速度有点慢,并且突然间收到了部分响应,刷新后我得到了剩余部分。

有没有办法确保将完整的缓冲区发送到客户端?

我使用以下代码:

byte[] buffer = System.Text.Encoding.UTF8.GetBytes(data);            
context.Response.ContentEncoding = System.Text.Encoding.UTF8;
context.Response.ContentLength64 = buffer.Length;
context.Response.Headers.Add("Content-Type", contentType);
context.Response.OutputStream.Write(buffer, 0, buffer.Length);
context.Response.OutputStream.Close();

【问题讨论】:

    标签: .net buffer httplistener


    【解决方案1】:

    我在这里看到的第一件事是您实际上并没有调用 context.Response.Close,而您确实需要这样做。关闭响应将关闭流,但没有记录关闭流(据我所知)以关闭响应。关闭响应也会关闭请求对象,这里也没有关闭。

    这可能会解决问题。我可以想象在您的 VPN 测试中除了网络速度之外还有其他差异; VPN 测试可能来自浏览器或仅支持 HTTP 1.0 的代理服务器,这意味着他们会在他们想到之前期望连接已关闭(或者他们可能是 HTTP 1.1,但在标头中发送 connection: close)他们收到了全部回复。对输出流调用 Close 可能不会关闭套接字,但对响应本身调用 close 会,这最终可能会解决您的问题。

    希望这对以后阅读的其他人有所帮助。

    哈罗德

    【讨论】:

      猜你喜欢
      • 2012-04-12
      • 1970-01-01
      • 2010-10-22
      • 2018-07-11
      • 1970-01-01
      • 2015-08-10
      • 1970-01-01
      • 2011-11-28
      相关资源
      最近更新 更多