質問

ファイルのダウンロード用のコードは次のとおりです:

        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で実行されているときにファイル長が取得できないのはなぜですか?

役に立ちましたか?

解決

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

ところで、Response.End呼び出しをドロップするのは非常にトラウマ的なことであり、不要です(そのため、Clearの呼び出しも同様です)。

編集

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

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

他のヒント

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

public void WriteCSV(string strData) {
   //Required for IIs7 WS2008R2 fix
   Response.ClearHeaders();
   Response.Clear();


   Response.Buffer = true; 
   Response.ContentType = "application/csv";
   Response.AddHeader("Content-Disposition", "attachment;filename=report.csv");
   Response.Write(strData);
   Response.Flush();
   Response.End();
}
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top