假设您有一个包含以下代码行的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中应该有一些配置,这是由我的压力测试触发但是配置。
答案 0 :(得分:1)
答案很有趣但让我们回顾一下为什么我问这个问题以及我是如何找到答案的。
在我遇到问题后,我搜索了网络,发现类似的问题从来没有得到答案。根据我的经验,当你提出一个没有其他人问过的问题,或者有很多类似的问题而没有机会得到回答的时候,问题是错的,但我当时没想到。 断开连接后,我更改了压力测试参数,发现客户端在测试结束时断开连接(正如我告诉测试设计是基于时间的)。在我的代码的某个地方,我做错了什么,在关闭请求的某个地方。 尽管在.NET中无处不在,你应该在ASP.NET中关闭连接,释放资源和调用处理对象,你根本不应该调用这个方法:
Response.Close()
在ASP.NET页面中完成后,您应该让IIS完成剩下的工作(让执行路径保留代码)。我相信它有些不对劲。也许它不应该在asp.net页面范围内公开,或者方法名称应该类似于Response.Disconnect()
,因为它与清理代码非常相似。
是的,我通过Response.Close()
删除该代码后一切正常但是当机器空闲RAM不够时我得到这个错误,这是值得欢迎的,因为你可以通过添加一些RAM来克服这个错误:
An existing connection was forcibly closed by the remote host.