2009-05-06 10 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

この例外は、ファイルのダウンロードが完了する前に、ファイルをダウンロードしているクライアントが接続を切断したことを意味します。つまり、クライアントが別のページに移動したか、ブラウザを閉じただけです。

iStream.Readの後ろにif (Response.IsClientConnected)行を移動してみてください。たとえそれを行ったとしても、まだOutputStream.Writeメソッドが動作している間に接続が壊れても、このエラーが発生する可能性があります。

+3

私は例外を再現することができませんでしたダウンロードをキャンセルしてください。ダウンロード中にネットワーク接続を切断しようとしました。火災の例外も発生しませんでした。 – spaetzel

+11

@ spaetzel - これで問題が解決しなかった場合、なぜこの投稿を回答にしましたか? – tresstylez

12

これにはいくつかの原因が考えられます。

2GBに近いデータをバッファに書き込んでいますが、定期的にフラッシングしているので、ここではそうではありません。

もう1つは実際にあなたが以前に受け入れた答えに記述されています。再現するのは非常に難しいので、必ずしも間違っているとは思わないでしょう。

もう1つの可能性のあるケースと私が賭けるものは、executionTimeoutが超過してThreadAbortExceptionが最初に発生することですが、これはFlush()の失敗を引き起こし、

4

web.configのhttpRuntime要素でexecutionTimeoutを増やします。

低速接続で大きなファイルをダウンロードしている場合、要求は最終的にタイムアウトします。

2

私はこの回答を投稿しています。他人を助け、重要な時間を節約できる可能性があるためです。

Response.Buffer = trueダウンロード方法(非常に最初のステートメントで)で問題を解決しました。

ありがとうございました

関連する問題