HttpListener响应对于“大”缓冲区刷新过早

3
我有一个使用Topshelf运行的服务,它查询专有的CRM系统数据。该服务为此CRM系统提供REST前端。一切正常,我以JSON格式接收响应。
我有一个特定的查询,返回近500KB的JSON响应。对于局域网中的计算机,这很好用,但是当使用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();
1个回答

0

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

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

希望这对未来任何其他人有所帮助。

哈罗德


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接