2009-05-06 2 views
21

Этот код потоков больших файлов для наших пользователей:«Удаленный узел закрыл соединение» в Response.OutputStream.Write

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

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

Любая идея, что является источником этой проблемы? Можно ли игнорировать?

+0

Возможный дубликат [Удаленный хост закрыл соединение. Код ошибки: 0x800704CD] (http://stackoverflow.com/questions/5564862/the-remote-host-closed-the-connection-the-error-code-is-0x800704cd) –

ответ

17

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

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

+3

Я так и не смог воспроизвести исключение путем отмены загрузки. Мы даже попытались отключить наше сетевое подключение во время загрузки. Ничто не вызвало пожар. – spaetzel

+11

@ spaetzel - Если это не решило вашу проблему, почему вы отметили это сообщение как ответ? – tresstylez

12

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

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

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

Еще один возможный случай и тот, на который я поставил бы ставку, заключается в том, что превышение исполненияTimeout, которое сначала вызовет исключение ThreadAbortException, но это может привести к тому, что отказ Flush() превратится в исключение

4

Увеличить выполнениеTimeout в элементе httpRuntime web.config.

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

2

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

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

Thanks

Смежные вопросы