2009-09-11 4 views
8

私はいくつかのレガシーコードを見直していますが、レスポンスが無期限に存在するバグを発見しました。私の応答ヘッダーにContent-Lengthを設定する必要はありますか?

Response.Content-Type = "application/octet-stream" 
Response.AddHeader("Content-Disposition", "attachment; filename" & someFileName) 
Response.AddHeader("Content-Length", someStoredLength) 
Response.BinaryWrite(someByteArray) 
Response.Flush() 
Response.End() 

問題はsomeStoredLengthがsomeByteArrayの実際のサイズよりもはるかに大きいということですので、クライアントは単にブラウザだけでスピンしながら、ファイルのダウンロードを待ってそこに座っている:

は、ここで基本的な考え方です。

コンテンツの長さを指定するAddHeaderを削除することを検討しています。これを行うとすべてうまくいくようですが、何かを理解していないと心配しています。

このAddHeaderを削除しても問題ないですか、この問題に対処するより良い方法を見つけ出すべきですか?

+0

これは何語ですか?上記のコードでResponseオブジェクトはどのようなクラスですか? – noctonura

+0

@RichAmberale:それは本当に質問には関係ありません。この問題は、HTTPヘッダーのためにブラウザで発生します。 –

+0

コードはVB.NETにありますが、これは、従来のASPの古典で行われている他の場所で見つけることができます – Joseph

答えて

8

変更し、次へのContent-Lengthライン:

Response.AddHeader("Content-Length", someByteArray.Length.ToString()) 
+0

私もそれをやろうと考えていました。それが良い選択肢になるのだろうかと思っていました。私はバイト配列を持っている場合は、Lengthプロパティは常に私に正しいサイズを与えるのだろうか? – Joseph

+0

はい。 content-lengthヘッダーは、コンテンツのバイト数を示します。あなたのコンテンツはバイトの配列なので、あなたは良いです。 – Stephen

10

あなたのアプリケーションSHOULD(Content-Lengthまでスクロールダウン)で定義しますが、厳密には必須ではありません。

可能なオプションはdecent discussionです。

+2

リンクされた記事で提案された解決策(「長さを設定しすぎて、大きすぎる可能性があります)本当に悪い考えのように思える。現在のユーザエージェントで何も壊れていなくても、 "Content-length"ヘッダーの全体概念を損なうので、珍しいが完全に標準に準拠したHTTPクライアントライブラリを破損する可能性があります。ファイルのサイズがあらかじめわかっていない場合は、すべての場合でチャンク転送符号化を使用する必要があります(接続を再利用する場合は、キープアライブ)必要があります。 – lxgr

+0

[Content-Length](http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.13)への直接のリンクについては、[HttpBis](http://tools.ietf.org)も参照してください。 /html/draft-ietf-httpbis-p1-messaging-25#section-3.3.2) – paulkmoore

関連する問題