【问题标题】:IIS 7.0 large file transfer: "Unable to read data from the transport connection: The connection was closed."IIS 7.0 大文件传输:“无法从传输连接读取数据:连接已关闭。”
【发布时间】:2011-04-23 07:40:02
【问题描述】:

假设您有一个包含以下代码行的 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 中进行一些配置,这是由我的压力测试触发的,但是是哪个配置。

【问题讨论】:

  • 你检查服务器上的事件日志了吗?
  • 是的,它只记录请求的详细信息,仅此而已。 IIS 日志记录可能需要一些配置?

标签: asp.net iis-7 stress-testing


【解决方案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.

【讨论】:

    猜你喜欢
    • 2015-01-15
    • 1970-01-01
    • 2017-07-19
    • 1970-01-01
    • 1970-01-01
    • 2023-01-11
    • 1970-01-01
    • 2020-11-03
    • 1970-01-01
    相关资源
    最近更新 更多