web-dev-qa-db-ja.com

ASP.NET応答で、明示的または暗黙的にTransfer-Encodingをチャンクに設定するにはどうすればよいですか?

_Transfer-Encoding_ヘッダーを簡単に設定できますか?

ある時点でResponse.Flush()を呼び出すと、これが暗黙的に発生しますか?


[〜#〜]編集[〜#〜]
いいえ、Response.Headers.Add("Transfer-Encoding","anything");を呼び出すことはできません。

他の提案はありますか?


関連:
ASP.NETでチャンク転送エンコーディングを有効にする

15
Cheeso

TL; DR: content-lengthを指定することは、最初のバイトを高速化するための最良の方法です。 HTTPレベルではなくTCP)でチャンク化を許可します。コンテンツの長さがわからない場合は、context.Response.BufferOutputfalseに設定すると、出力ストリームが書き込まれるときに出力が送信されます。チャンク転送エンコーディングを使用します。


なぜTransfer-Encoding: chunkedを設定したいのですか?チャンク転送は、基本的に、コンテンツの長さが事前にわからないドキュメントの送信を許可するための回避策です。ただし、ASP.NETはデフォルトで出力全体をバッファリングするため、doesはコンテンツ全体の長さを認識します。

もちろん、HTTPはTCP上に階層化されており、舞台裏ではTCPは、モノリシックHTTP応答でさえパケットに分割することで「チャンク」しています。つまり、コンテンツの長さを事前に指定すると、出力バッファリングを無効にすると、最高のレイテンシが得られますwithoutHTTPレベルのチャンクが必要です。したがって、HTTPレベルのチャンクを提供する必要はありません。 content-lengthがわかっている場合、最初のバイトは高速です。

私はHTTPの専門家ではありませんが、サポート、動的圧縮、キャッシュなどを求める単純なストリーミングメディアサーバーを実装しており、高速の最初のバイトの関連性を合理的に把握しています-チャンクは一般的に劣っていますオプションifあなたはcontent-lengthを知っています-これがASP.NETが手動で設定できない理由です-それは必要ではありません。

ただし、do n't送信前のHTTPコンテンツの長さを知っていて、バッファリングが高すぎる場合は、出力バッファリングをオフにすると、サーバーは次の方法でチャンク転送エンコーディングを使用する可能性があります。必要性。

サーバーはいつチャンク転送エンコーディングを使用しますか?テストしたばかりで、実際にcontext.Response.BufferOutputfalseに設定されているかどうか、およびコンテンツの長さが設定されていない場合、応答はチャンク化されます。このような応答は、1.7MBのコンテンツエンコーディング:gzip xmlドキュメントの完全に非科学的なクイックテストで1〜2%大きくなります。 gzipは冗長性を減らすためにコンテキストに依存しているため、圧縮率がさらに低下すると予想していましたが、チャンク化によって必ずしも圧縮率が大幅に低下するわけではないようです。

リフレクターでフレームワークコードを見ると、転送エンコーディングは実際に必要に応じて自動的に設定されているようです。つまり、バッファリングがオフで、コンテンツの長さが不明で、応答がHTTP/1.1リクエストに対するものである場合、チャンク転送エンコーディングが使用されます。 。ただし、サーバーがIIS7であり、これがワーカー要求(「統合モード」)である場合、コードはネイティブメソッドに分岐します。おそらく同じ動作ですが、確認できません。

22
Eamon Nerbonne

Response.Buffer = False

これにより、HTTPヘッダー「Tranfer-Encoding:Chunked」が設定され、それぞれresponse.writeと呼ばれる応答が送信されます。

0
Ivan Correa

バッファをfalseに設定し、コンテンツの長さを空のままにしますが、チャンク応答を機能させるには、IIS7の「動的コンテンツ圧縮」機能が無効になっていることを確認する必要があります。また、クライアントブラウザには少なくともHTTP1.1が必要です。チャンクモードはHTTP1.0では機能しません。

0
Zuuum

これにはIISを設定する必要があるようです。IIS 6にはメタベースにAspEnableChunkedEncodingプロパティがあり、IIS MSDNのこのための7つのマッピング http://msdn.Microsoft.com/en-us/library/aa965021(VS.90).aspx 。これにより、TRANSFER-を設定できます。エンコード:ヘッダーにチャンクされています。これがお役に立てば幸いです。

0
Kim R