このコードは、大きなファイルをユーザーにストリーミングします。
// 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)
ユーザーがファイルのダウンロードに問題を抱えているという証拠は一度もありません。この例外を単に無視する予定です。
この問題の原因は何ですか?無視しても大丈夫ですか?
この例外は、ファイルをダウンロードしているクライアントが、ファイルのダウンロードが完了する前に接続を切断したことを意味します。つまり、クライアントが別のページに移動したか、ブラウザを閉じただけです。
_iStream.Read
_の後にif (Response.IsClientConnected)
行を移動してみます。それを行ったとしても、_OutputStream.Write
_メソッドがまだ機能しているときに接続が切断されると、このエラーが発生する可能性があると思います。
これにはいくつかの異なる原因が考えられます。私は3つ考えることができます:
1つは、バッファを2 GB近くのデータで満たすことですが、定期的にフラッシュしているため、ここではそうではないはずです。
もう1つは、以前に受け入れた回答に記載されていることです。再現するのはとても難しいので、必ずしも間違っていたとは思いません。
もう1つの考えられるケース、そして私が賭けるケースは、executionTimeoutを超えたため、最初はThreadAbortExceptionが発生しますが、これによりFlush()が失敗し、上記の例外が発生する可能性があります。
Web.configのhttpRuntime要素のexecutionTimeoutを増やします。
ユーザーが低速接続で大きなファイルをダウンロードしている場合、リクエストは最終的にタイムアウトします。
他の人を助け、重要な時間を節約できるかもしれないので、私はこの答えを投稿しています。
私の場合 Response.Buffer = true
ダウンロード方法(最初のステートメント)で問題が解決しました。
ありがとう