1

HttpHandlerを使用してユーザーにファイルを送信しています。すべてのブラウザで、ファイルを少なくとも1回表示/ダウンロードした後、後続の表示/ダウンロードのブラウザ/アプリケーションがハングします。コードは次のとおりです。

    private void TransmitFile(HttpContext context, string filePath, string downloadName, bool forceDownload)
    {
        if (File.Exists(filePath))
        {
            string fileName = System.IO.Path.GetFileName(filePath);
            string extension = Path.GetExtension(filePath);
            FileInfo fileInfo = new FileInfo(filePath);

            // set the response info/headers
            context.Response.ClearContent();
            context.Response.ClearHeaders();
            context.Response.AddHeader("Content-Length", fileInfo.Length.ToString());
            if (forceDownload)
            {
                context.Response.AddHeader("Content-Disposition", "attachment; filename=" + downloadName.Replace(" ", "_") + extension);
                context.Response.BufferOutput = false;
            }

            string type = "";
            // set known types based on file extension  
            if (extension != null)
            {
                switch (extension.ToLower())
                {
                    case ".tif":
                    case ".tiff":
                        type = "image/tiff";
                        break;
                    case ".jpg":
                    case ".jpeg":
                        type = "image/jpeg";
                        break;
                    case ".gif":
                        type = "image/gif";
                        break;
                    case ".doc":
                    case ".rtf":
                        type = "Application/msword";
                        break;
                    case "pdf":
                        type = "Application/pdf";
                        break;
                    case "png":
                        type = "image/png";
                        break;
                    case "bmp":
                        type = "image/bmp";
                        break;
                    default:
                        type = "application/octet-stream";
                        break;
                }
            }

            context.Response.ContentType = type;
            context.Response.TransmitFile(filePath);
            context.Response.Flush();
        }
        else
        {
            Immersive.Diagnostics.Log.Warn("Requested file does not exist: " + filePath, this);
            Immersive.Diagnostics.Log.Warn("", this);
        }
    }

Response.Close()とResponse.End()を呼び出すのは良い考えではないことを読みましたか?残すことと取り除くことの両方を試みました、そしてそれはまだ起こります。

編集:

TransmitFileには既知の問題があるようです。より詳細な説明は次の場所にあります:http: //www.improve.dk/blog/2008/03/29/response-transmitfile-close-will-kill-your-application

TransmitFileを削除してWriteFileに変更したところ、完全に機能するようになりました。

context.Response.WriteFile(filePath);
context.Response.Flush();
context.Response.Close();
4

2 に答える 2

0

バッファリングを使用していない理由は何ですか?使用していないのにFlush()している。はい、Flush()の後にResponse.End()も実行する必要があると思います。

これが機能するかどうかを教えてください。おそらく、自分でいくつかのテストを実行できます。

于 2009-05-20T03:47:12.323 に答える
0

これは、ダウンロード元のサーバーがWindows Server2003SP1を実行している場合の既知の問題である可能性があります。

修正プログラムは次のとおりです:http ://support.microsoft.com/kb/902780

また、OutputCacheページで有効になっているかどうかを確認してください。有効になっている場合は、有効にしていない状態でダウンロードを再試行してください。

于 2009-05-20T04:46:46.213 に答える