Transfer-Encoding
ヘッダー を設定するだけでいいですか?
ある時点で呼び出すとResponse.Flush()
、これが暗黙的に発生しますか?
編集
いいえ、私はResponse.Headers.Add("Transfer-Encoding","anything");
それをスローと呼ぶことはできません。
他に何か提案はありますか?
Transfer-Encoding
ヘッダー を設定するだけでいいですか?
ある時点で呼び出すとResponse.Flush()
、これが暗黙的に発生しますか?
編集
いいえ、私はResponse.Headers.Add("Transfer-Encoding","anything");
それをスローと呼ぶことはできません。
他に何か提案はありますか?
TL; DR: content-lengthを指定することは、最初のバイトを高速化するための最良の方法です。HTTPレベルではなくTCPでのチャンク化を許可します。content-lengthがわからない場合は、に設定context.Response.BufferOutput
するfalse
と、チャンク転送エンコーディングを使用して出力ストリームに書き込まれるときに出力が送信されます。
なぜ設定したいのTransfer-Encoding: chunked
ですか?チャンク転送は、基本的に、コンテンツの長さが事前にわからないドキュメントの送信を許可するための回避策です。ただし、ASP.NETはデフォルトで出力全体をバッファリングするため、コンテンツ全体の長さを認識します。
もちろん、HTTPはTCP上に階層化されており、舞台裏では、モノリシックHTTP応答でさえパケットに分割することでTCPが「チャンク」しています。つまり、コンテンツの長さを事前に指定して出力バッファリングを無効にすると、HTTPレベルのチャンクを必要と せずに最高のレイテンシー。したがって、コンテンツの長さがわかっている場合、高速の最初のバイトを提供するためにHTTPレベルのチャンクは必要ありません。
私はHTTPの専門家ではありませんが、サポート、動的圧縮、キャッシングなどを求める単純なストリーミングメディアサーバーを実装しました。高速の最初のバイトの関連性を合理的に把握しています。チャンクは一般的に劣っています。content-lengthがわかっている場合は、オプションを選択します。これが、ASP.NETで手動で設定できない理由です。これは必要ありません。
ただし、送信とバッファリングのコストが高すぎる前にHTTPコンテンツの長さがわからない場合は、出力バッファリングをオフにすると、サーバーは必然的にチャンク転送エンコーディングを使用する可能性があります。
サーバーはいつチャンク転送エンコーディングを使用しますか?テストしたばかりですcontext.Response.BufferOutput
がに設定されてfalse
いる場合、コンテンツの長さが設定されていない場合、応答はチャンク化されます。このような応答は、1.7MBのコンテンツエンコーディング:gzip xmlドキュメントの完全に非科学的なクイックテストでは1〜2%大きくなります。gzipは冗長性を減らすためにコンテキストに依存しているため、圧縮率がさらに低下すると予想していましたが、チャンク化によって必ずしも圧縮率が大幅に低下するわけではないようです。
リフレクターでフレームワークコードを見ると、転送エンコーディングは実際に必要に応じて自動的に設定されているようです。つまり、バッファリングがオフで、コンテンツの長さが不明で、HTTP / 1.1リクエストへの応答である場合、チャンク転送エンコーディングが使用されます。 。ただし、サーバーがIIS7であり、これがワーカー要求(?統合モード?)である場合、コードはネイティブメソッドに分岐します-おそらく同じ動作ですが、それを確認することはできません。
このためにIISをセットアップする必要があるようです。IIS 6のメタベースにはプロパティAspEnableChunkedEncodingがあり、MSDNのhttp://msdn.microsoft.com/en-us/library/aa965021(VS.90).aspxでこのIIS7マッピングを確認できます。これにより、ヘッダーにチャンク化されたTRANSFER-ENCODING:を設定できるようになります。これがお役に立てば幸いです。
バッファをfalseに設定し、コンテンツの長さを空のままにしますが、チャンク応答を機能させるには、IIS7の「動的コンテンツ圧縮」機能が無効になっていることを確認する必要があります。また、クライアントブラウザには少なくともHTTP1.1が必要です。チャンクモードはHTTP1.0では機能しません。
Response.Buffer = False
これにより、HTTPヘッダー「Tranfer-Encoding:Chuncked」が設定され、呼び出された各response.writeに応答が送信されます。