【问题标题】:"The remote host closed the connection" in Response.OutputStream.WriteResponse.OutputStream.Write 中的“远程主机关闭了连接”
【发布时间】:2022-02-26 03:35:03
【问题描述】:

此代码将大文件流式传输给我们的用户:

                // Open the file.
            iStream = new System.IO.FileStream(filepath, System.IO.FileMode.Open,
                        System.IO.FileAccess.Read, System.IO.FileShare.Read);


            // Total bytes to read:
            dataToRead = iStream.Length;

            // Read the bytes.
            while (dataToRead > 0)
            {
                // Verify that the client is connected.
                if (Response.IsClientConnected)
                {
                    // Read the data in buffer.
                    length = iStream.Read(buffer, 0, 10000);

                    // Write the data to the current output stream.
                    Response.OutputStream.Write(buffer, 0, length);

                    // Flush the data to the HTML output.
                    Response.Flush();

                    buffer = new Byte[10000];
                    dataToRead = dataToRead - length;
                }
                else
                {
                    //prevent infinite loop if user disconnects
                    dataToRead = -1;
                }
            }

我们每隔一段时间就会收到此异常:

The remote host closed the connection. The error code is 0x80072746

这是完整的堆栈跟踪:

Stack Trace:
   at System.Web.Hosting.ISAPIWorkerRequestInProcForIIS6.FlushCore(Byte[] status, Byte[] header, Int32 keepConnected, Int32 totalBodySize, Int32 numBodyFragments, IntPtr[] bodyFragments, Int32[] bodyFragmentLengths, Int32 doneWithSession, Int32 finalStatus, Boolean& async)
   at System.Web.Hosting.ISAPIWorkerRequest.FlushCachedResponse(Boolean isFinal)
   at System.Web.Hosting.ISAPIWorkerRequest.FlushResponse(Boolean finalFlush)
   at System.Web.HttpResponse.Flush(Boolean finalFlush)
   at System.Web.HttpResponse.Flush()
   at System.Web.HttpWriter.WriteFromStream(Byte[] data, Int32 offset, Int32 size)
   at System.Web.HttpResponseStream.Write(Byte[] buffer, Int32 offset, Int32 count)
   at BIS.DocumentBus.Controls.DocumentViewer.StreamFile(String filepath)

我们从未有证据表明用户在下载我们的文件时遇到问题,并计划直接忽略此异常。

知道这个问题的根源是什么吗?可以忽略吗?

【问题讨论】:

标签: c# asp.net streaming


【解决方案1】:

该异常意味着下载文件的客户端在文件完成下载之前中断了连接。即客户端导航到另一个页面,或者只是关闭了浏览器。

我可能会尝试将if (Response.IsClientConnected) 行移到您的iStream.Read 之后。即使您这样做了,我认为如果在 OutputStream.Write 方法仍在工作时连接断开,我认为仍有可能收到此错误。

【讨论】:

  • 我无法通过取消下载来重现异常。我们甚至尝试在下载过程中断开网络连接。两者都没有导致异常触发。
  • @spaetzel - 如果这不能解决您的问题,您为什么将这篇文章标记为答案?
【解决方案2】:

这有几个不同的可能原因。我能想到三个:

一个正在用接近 2GB 的数据填充缓冲区,但这里不应该是这种情况,因为您会定期刷新。

另一个确实是您之前接受的答案中描述的。它很难重现,所以我不认为它一定是错误的。

另一种可能的情况,也是我敢打赌的情况,是超过了 executionTimeout,这首先会导致 ThreadAbortException,但这反过来又会导致 Flush() 失败,这将变成异常记录

【讨论】:

    【解决方案3】:

    在 web.config 的 httpRuntime 元素中增加 executionTimeout。

    如果用户在慢速连接下载大文件,请求最终会超时。

    【讨论】:

      【解决方案4】:

      我发布这个答案是因为它可能会帮助其他人并节省一些重要的时间。

      在我的情况下,Response.Buffer = true 在下载方法中(在第一条语句中)解决了这个问题。

      谢谢

      【讨论】:

        【解决方案5】:

        我知道这是一个 C# 问题,但是在我的 iPad 上,当我将它连接到 Charles Proxy 时,我可以在触发网络呼叫时半一致地重现此问题,但随后会立即使应用程序后台运行。

        我尽可能快地点击主页按钮以将应用程序置于后台。我的总请求/响应时间大约需要 6 秒。

        如果我在 1-2 秒内进入后台,响应通常会恢复正常。如果我在不到 0.5 秒内将应用程序后台化,那么请求通常会失败。我对 TCP 没有透彻的了解,但可能是 TCP 握手还没有完成,连接刚刚断开,因此出现错误消息。

        这与other answer 的说法相匹配:

        我一直得到这个。这意味着用户开始下载文件,然后下载失败或取消。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-01-25
          • 1970-01-01
          • 2020-11-30
          • 2017-12-22
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多