1

假设您有一个包含以下代码行的 ASP.NET 页面:

while (true)
{
   byte[BUFFER_SIZE] buffer;
   // Fill buffer with pseudo data
   Response.OutputStream.Write(buffer, 0, buffer.Length);
   Response.Flush();
}

您还有一个包含以下代码行的上述页面的测试应用程序:

while (readBytes != 0)
{
   byte[BUFFER_SIZE] buffer;
   readBytes = stream.Read(buffer, 0, buffer.length)
}

我没有读取真正的大文件,而是尝试动态生成随机二进制数据并传输到客户端,它运行良好。然后,我编写了一个客户端,它只从 ASP.NET 页面读取字节,然后什么都不做,只读取下一个字节,直到 ASP.NET 页面关闭连接(下载完成)。我在 ASP.NET 页面中使用了基于时间的设置来确定何时完成下载(这是一个压力测试)。

所以 IIS 7.0 和 ASP.NET 正在做的是在一段时间(即一小时)内流式传输数据。我在这个页面上启动了 100 个并发客户端,平均下载速度为 250 KB/s,一小时。大约 45 分钟一切正常,但 IIS 突然在客户端关闭了所有连接并出现此错误代码:

无法从传输连接读取数据:连接已关闭。

我想这是关于通过 IIS 传输大量二进制数据,并且 IIS 7.0 中应该有一些配置,这是由我的压力测试触发的,但是是哪个配置。

4

1 回答 1

1

答案很有趣,但让我们回顾一下我问这个问题的原因以及我是如何找到答案的。

遇到问题后,我在网上搜索,发现类似的问题从来没有答案。根据我的经验,当你问一个其他人没有问过的问题,或者当有许多类似的问题没有机会得到回答时,这个问题有问题,但我当时没有想到。断开连接后,我更改了压力测试参数并发现客户端在测试结束时断开连接(正如我所说的测试是基于时间设计的)。在我的代码中某个地方我做错了事,在某个地方关闭了请求。尽管在 .NET 中您应该关闭连接、释放资源并在 ASP.NET 中对对象调用 dispose,但您根本不应该调用此方法:

Response.Close()

在 ASP.NET 页面中完成后,您应该让 IIS 完成其余的工作(让执行路径保留您的代码)。我相信它有问题。也许它不应该在 asp.net 页面范围内公开,或者方法名称应该是这样Response.Disconnect()的,因为它与清理代码非常相似。

是的,我通过与客户断开连接来踢自己Response.Close()

删除该代码后一切正常,但是当机器可用 RAM 不足时,我收到此错误,这是受欢迎的,因为您可以通过添加一些 RAM 来克服此问题:

An existing connection was forcibly closed by the remote host.
于 2010-10-10T13:24:20.557 回答