web-dev-qa-db-ja.com

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)

ユーザーがファイルのダウンロードに問題を抱えているという証拠は一度もありません。この例外を単に無視する予定です。

この問題の原因は何ですか?無視しても大丈夫ですか?

23
spaetzel

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

_iStream.Read_の後にif (Response.IsClientConnected)行を移動してみます。それを行ったとしても、_OutputStream.Write_メソッドがまだ機能しているときに接続が切断されると、このエラーが発生する可能性があると思います。

18
David

これにはいくつかの異なる原因が考えられます。私は3つ考えることができます:

1つは、バッファを2 GB近くのデータで満たすことですが、定期的にフラッシュしているため、ここではそうではないはずです。

もう1つは、以前に受け入れた回答に記載されていることです。再現するのはとても難しいので、必ずしも間違っていたとは思いません。

もう1つの考えられるケース、そして私が賭けるケースは、executionTimeoutを超えたため、最初はThreadAbortExceptionが発生しますが、これによりFlush()が失敗し、上記の例外が発生する可能性があります。

12
Jon Hanna

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

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

4
Tomas Voracek

他の人を助け、重要な時間を節約できるかもしれないので、私はこの答えを投稿しています。

私の場合 Response.Buffer = trueダウンロード方法(最初のステートメント)で問題が解決しました。

ありがとう

2
immayankmodi