2009-05-06 25 views
21

Questo codice flussi di file di grandi dimensioni per i nostri utenti:"L'host remoto ha chiuso la connessione" in 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; 
       } 
      } 

ogni tanto e un po 'che riceviamo questa eccezione:

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

qui è la piena analisi dello stack:

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) 

non abbiamo mai avuto la prova che gli utenti stanno avendo problemi nel download i nostri file e piano di ignorare semplicemente questa eccezione.

Qualche idea sulla causa di questo problema? È sicuro ignorare?

+0

Possibile duplicato di [L'host remoto ha chiuso la connessione. Il codice di errore è 0x800704CD] (http://stackoverflow.com/questions/5564862/the-remote-host-closed-the-connection-the-error-code-is-0x800704cd) –

risposta

17

Questa eccezione indica che il client che ha scaricato il file ha interrotto la connessione prima del completamento del download del file. Ad esempio, il client ha navigato su un'altra pagina o ha semplicemente chiuso il browser.

Potrei provare a spostare la riga if (Response.IsClientConnected) dopo il iStream.Read. Anche se l'hai fatto, penso che potrebbe ancora esserci la possibilità di ricevere questo errore se la connessione viene interrotta mentre il metodo OutputStream.Write funziona ancora.

+3

Non sono mai stato in grado di riprodurre l'eccezione cancellando il download. Abbiamo anche provato a disconnettere la nostra connessione di rete durante il download. Né ha causato l'eccezione al fuoco. – spaetzel

+11

@ spaetzel - Se questo problema non è stato risolto, perché hai contrassegnato questo post come risposta? – tresstylez

12

Ci sono alcune diverse cause possibili di questo. Posso pensare a tre:

Uno sta riempiendo il buffer con circa 2 GB di dati, ma questo non dovrebbe essere il caso qui, dato che stai sciacquando regolarmente.

Un altro è effettivamente quello descritto nella risposta che hai accettato in precedenza. È molto difficile da riprodurre, quindi non penserei che fosse necessariamente sbagliato.

Un altro caso possibile, e quello su cui punterei, è che il Timeout di esecuzione viene superato, il che causerebbe inizialmente un ThreadAbortException, ma questo potrebbe a sua volta causare l'errore di Flush() che si trasformerebbe nell'eccezione annotata

4

Aumentare il timeoutTimeout nell'elemento httpRuntime di web.config.

Se l'utente sta scaricando file di grandi dimensioni su una connessione lenta, la richiesta verrà eventualmente interrotta.

2

Sto postando questa risposta perché potrebbe essere di aiuto agli altri e risparmiare un po 'di tempo importante.

Nel mio caso Response.Buffer = true nel metodo di download (sulla primissima istruzione) risolto il problema.

Grazie

Problemi correlati