1

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」になりました。それは正常な結果ですか?

助けてくれてありがとう。

4

1 に答える 1

1

より多くのテストを行い、いくつかのことを明確にしましたが、技術的に満足のいくものではありませんでした.

A1. IIS 7.5 動的圧縮が原因ではありません。動的圧縮、静的圧縮、またはその両方が無効になっているかどうかに関係なく、ダウンロードの破損が発生しました。Response.AddHeader("Content-Length" ... という行がコードでコメントアウトされるとすぐに、ダウンロードの問題はすべて解消されました。

A2. わからない!本当に知りたいです。

A3. この動作は、おそらく Firefox のバグです。これは、「Content-Length」ヘッダーとは関係ありません。

于 2011-05-16T19:00:22.990 に答える