Windows2008R2のIIS7.5で.NET4.0を使用する。
さまざまな種類のドキュメント(画像、PDF、Officeファイルなど)を表すバイナリコンテンツを出力したいと思います。コンテンツ全体がすでにMemoryStreamにあると仮定して、次のように出力したいと思います。
Response.Clear();
Response.AddHeader("Content-Disposition", string.Format("attachment; filename={0}", fileNameSaveAs));
Response.AddHeader("Content-Length", memoryStr.Length.ToString());
Response.ContentType = "application/octet-stream";
Response.OutputStream.Write(memoryStr.ToArray(), 0, (int) memoryStr.Length);
Response.Flush();
上記のコードは信頼できません。多くの場合、ファイルが破損しています。さまざまなブラウザを使用しているクライアントは、ダウンロードが中止されたり、読み取れないファイルをダウンロードしたりすることがあります。ファイルサイズが大きくなると、破損する可能性が高くなります。fiddlerを使用して、応答ヘッダーが元のファイルサイズとは異なるコンテンツの長さを報告していることがわかりました。したがって、簡単なテストのために、Response.AddHeader( "Content-Length" ...)という行をコメントアウトすると、破損の問題は解消されました。
Q1:この問題は動的圧縮(デフォルトでIIS7で有効)が原因ですか?
Q2:Q1の答えが「はい」の場合、Content-Lengthについてクライアントに通知するための洗練されたソリューションはありますか?
Q3:「Content-Length」ヘッダーを削除すると、ファイルを名前を付けて保存するクライアントの機能に影響するようです。例:「Content-Disposition」は、fileNameSaveAs = "OneTwoThree.pdf"で初期化されます。Firefoxを使用すると、ファイルを受信すると、ダウンロードダイアログはデフォルトでファイル名として「One」になりました。それは正常な結果ですか?
助けてくれてありがとう。