1

私はファイルのダウンロードのために次のコードを持っています:

        FileInfo fileInfo = new FileInfo(filePath);

        context.Response.Clear();
        context.Response.ContentType = "application/octet-stream";
        context.Response.AddHeader("Content-Disposition", "attachment; filename=" + System.IO.Path.GetFileName(filePath));
        context.Response.AddHeader("Content-Length", fileInfo.Length.ToString());
        context.Response.WriteFile(filePath);
        context.Response.End();

ローカルのIIS6で実行すると、正常に動作します。Webブラウザ(IE8、Firefox 3.5.2、Opera 10でテスト済み)は、ファイルのダウンロードを開始する前にファイルの長さを表示します。

このコードをリモートIIS7で実行すると、Webブラウザにファイルの長さが表示されません。ファイルの長さは不明です。

このコードをIIS7で実行すると、ファイルの長さが取得されないのはなぜですか?

4

2 に答える 2

3

Fiddlerを使用して、実際に送信される内容を確認します。私の推測では、IIS7サーバーでバッファリングがfalseに設定された結果として、チャンク化されたエンコーディングが取得されています。

ところで、Response.Endの呼び出しは非常にトラウマ的なことであり、不要です(さらに言えば、Clearの呼び出しも同様です)。

編集

厳密に言えば、チャンクエンコーディングを使用してコンテンツをストリーミングする場合(シナリオでは望ましい)、Content-Lengthヘッダーは存在しないはずです(RFC2616セクション4.4を参照)。IIS7はこれを強制するためにそれ自体を採用しているようです。実際、バッファリングがオフのときにCOMコードがContent-Lengthヘッダーを追加しようとすると、IIS7がエラーをスローするClassic-ASPシナリオがありました。

象牙の塔の委員会が何を望んでいるかにも関わらず、このヘッダーはエンドユーザーに非常に有用な情報を提供するため、これは本当に厄介です。

于 2009-09-12T19:21:13.530 に答える
0

この投稿をありがとう....最初の行でIEで動作するようになりました。

public void WriteCSV(string strData) {
   //IIs7 WS2008R2 修正に必要
   Response.ClearHeaders();
   Response.Clear();


   Response.Buffer = true;
   Response.ContentType = "アプリケーション/csv";
   Response.AddHeader("Content-Disposition", "attachment;filename=report.csv");
   Response.Write(strData);
   Response.Flush();
   Response.End();
}
于 2010-04-30T10:41:18.430 に答える