2009-05-06 8 views
21

Dieser Code-Streams von großen Dateien für unsere Nutzer:"Der Remote-Host hat die Verbindung geschlossen" 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; 
       } 
      } 

Jedes Mal eine Weile wir erhalten diese Ausnahme:

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

hier ist der vollständige Stack-Trace:

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) 

Ich nie Beweise gehabt habe, dass Benutzer Probleme beim Herunterladen von unseren Dateien haben und planen, diese Ausnahme einfach zu ignorieren.

Irgendeine Idee, was die Quelle dieses Problems ist? Ist es sicher zu ignorieren?

+0

Mögliche Duplikate von [Der Remote-Host hat die Verbindung geschlossen. Der Fehlercode ist 0x800704CD] (http://stackoverflow.com/questions/5564862/the-remote-host-closed-the-connection-the-error-code-is-0x800704cd) –

Antwort

17

Diese Ausnahme bedeutet, dass der Client, der die Datei heruntergeladen hat, die Verbindung abgebrochen hat, bevor die Datei heruntergeladen wurde. Der Kunde navigierte zu einer anderen Seite oder schloss den Browser einfach.

Ich könnte versuchen, die if (Response.IsClientConnected) Zeile nach Ihrer iStream.Read zu verschieben. Selbst wenn Sie das getan haben, denke ich, dass es immer noch eine Chance geben könnte, diesen Fehler zu erhalten, wenn die Verbindung unterbrochen wird, während die OutputStream.Write Methode immer noch funktioniert.

+3

Ich war nie in der Lage, die Ausnahme zu reproduzieren durch Abbrechen des Downloads. Wir haben sogar versucht, unsere Netzwerkverbindung während des Downloads zu trennen. Weder verursachte die Ausnahme zu schießen. – spaetzel

+11

@ spaetzel - Wenn das Ihr Problem nicht gelöst hat, warum haben Sie diesen Beitrag als Antwort markiert? – tresstylez

12

Es gibt einige verschiedene mögliche Ursachen dafür. Ich kann an drei denken:

Man füllt den Puffer mit knapp 2GB Daten, aber das sollte hier nicht der Fall sein, da man regelmäßig spült.

Ein anderer ist in der Tat, dass in der Antwort beschrieben, die Sie zuvor akzeptiert haben. Es ist sehr schwer zu reproduzieren, also würde ich nicht annehmen, dass es notwendigerweise falsch war. Ein anderer möglicher Fall, und der, auf den ich wetten würde, ist, dass der executionTimeout überschritten wird, was zuerst eine ThreadAbortException verursachen würde, aber dies könnte wiederum den Fehler von Flush() verursachen, der sich in die notierte Ausnahme verwandeln würde

4

Erhöhen Sie AusführungTimeout in httpRuntime Element von web.config.

Wenn der Benutzer eine große Datei auf einer langsamen Verbindung herunterlädt, wird die Anforderung möglicherweise überschritten.

2

Ich poste diese Antwort, weil es anderen helfen könnte und einige wichtige Zeit sparen.

In meinem Fall Response.Buffer = true in Download-Methode (auf allererste Anweisung) das Problem gelöst.

Danke

Verwandte Themen