«Удаленный узел закрыл соединение» в Response.OutputStream.Write - PullRequest
23 голосов
/ 06 мая 2009

Этот код передает большие файлы нашим пользователям:

                // 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)

У нас никогда не было доказательств того, что пользователи испытывают проблемы с загрузкой наших файлов, и планируем просто игнорировать это исключение.

Есть идеи, что является источником этой проблемы? Это безопасно игнорировать?

Ответы [ 4 ]

18 голосов
/ 07 мая 2009

Это исключение означает, что клиент, загружающий файл, разорвал соединение до того, как файл завершил загрузку. клиент перешел на другую страницу или просто закрыл браузер.

Я мог бы попытаться переместить строку if (Response.IsClientConnected) после вашего iStream.Read. Даже если вы сделали это, я думаю, что все еще может быть вероятность получить эту ошибку, если соединение разорвано, пока метод OutputStream.Write все еще работает.

12 голосов
/ 17 сентября 2010

Есть несколько возможных причин этого. Я могу думать о трех:

Один из них - заполнение буфера почти 2 ГБ данных, но здесь этого не должно быть, так как вы регулярно очищаете.

Другое действительно то, что описано в ответе, который вы ранее приняли. Воспроизвести очень сложно, поэтому я не могу предположить, что это обязательно было неправильно.

В другом возможном случае, на который я бы сделал ставку, превышено значение executeTimeout, которое сначала вызовет исключение ThreadAbortException, но, в свою очередь, может вызвать сбой Flush (), который превратится в отмеченное исключение

4 голосов
/ 21 сентября 2010

Увеличьте значение executeTimeout в элементе httpRuntime файла web.config.

Если пользователь загружает большой файл при медленном соединении, время ожидания запроса истечет.

2 голосов
/ 03 ноября 2013

Я публикую этот ответ, потому что он может помочь другим и сэкономить время.

В моем случае Response.Buffer = true в методе загрузки (на самом первом утверждении) решил проблему.

Спасибо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...