2010-10-09 128 views
1

假定你有几行代码的ASP.NET页面:IIS 7.0大文件传输:“无法从传输连接读取数据:连接已关闭。”

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 /秒,时间为一小时。一切正常约45分钟,但突然IIS关闭客户端上的此错误代码的所有连接:

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

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

+0

您是否检查过服务器上的事件日志? – 2010-10-09 22:18:16

+0

是的,它只记录请求的细节,仅此而已。 IIS日志记录可能需要一些配置? – Xaqron 2010-10-09 22:21:55

回答

1

答案很有趣,但让我们回顾一下为什么问这个问题以及我如何找到答案。

我遇到问题后,我搜索了网页,发现类似的问题从来没有答案。根据我的经验,当你问一个没有其他人问过的问题,或者有很多类似的问题没有机会得到答案的时候,这个问题是有问题的,但是那一刻我没有想到它。 断开连接后,我改变了压力测试参数,发现客户在测试结束时断开连接(因为我告诉测试是基于时间设计的)。在我的代码中某处,我做了一件错误的事情,在某个地方关闭了请求。 尽管到处都在.NET中,你应该关闭连接,释放资源并调用dispose就在这里对象在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. 
相关问题