2009-04-27 32 views
6

HttpListenerはあなたに応答ストリームを与えますが、flushを呼び出すことは何も意味しません(そして、ソースからは実際に何もしないのでクリアです)。 HTTP APIの内部を調べると、これはHttpListener自体の制限であることがわかります。HttpListener応答ストリームをフラッシュする方法は?

誰でもHttpListenerの応答ストリームをリフレッシュする方法を正確に知っています(リフレクションまたは追加のP/Invokesの可能性があります)。

更新:フラッシュオプションがない場合、またはバッファサイズを定義する能力がない場合は、httpストリームを配信できません。

答えて

2

Flushは、Transfer-EncodingがChunckedに設定されている場合、ほとんどのSystem.Net名前空間でのみ機能します。そうでない場合は、要求全体が返され、Flushは実際に何もしません。少なくともこれは私がHttpWebResponseを使って作業している間に経験したものです。

+0

質問はなぜ機能していません...しかし、できるだけ早く何かを送ることが重要な場合はhttpストリーミングを想像してください。チャンクされたデータは、ここではオプションではありません。要求を完了する前に実際に何かを送信しているHttpListenerが、かなり大きな構成不可能なバッファを使用しています。 – Mash

+0

btw、ASP.NETは要求時にOKをフラッシュします。ASP.NETは、完全なPOST本体が取得される前にInputStreamコンテンツを取得するためにいくつかのハックを必要としますが、OutputStreamは正常に動作します。 – Mash

+1

HTTPは実際にストリーミングプロトコルではありません。これは、インターネット上でテキストを送信することを目的としているため、ハイパーテキスト送信プロトコルという名前が付けられています。あなたがストリーミングをしたいなら、私はソケットを提案します。または、コンテンツをストリーミングするときに、パケットを小さくして制御するためには、もう少し良い方法があります。 –

0

まだ試したことはありませんが、ストリーミングレスポンス用に別のTCPサーバーを作成する方法はありますか?その後、HttpListenerから "内部" tcpサーバーに要求を転送します。このリダイレクトを使用すると、必要に応じてデータを元に戻すことができます。

フラッシングについては、実際に処分することなく、処分をシミュレートすることしか表示されません。 HttpResponseStreamオブジェクトをハックして、破棄するように指示したり、m_Closedフラグを解除したりすると、ストリーミングデータをフラッシュすることができます。

+0

別々のTCPサーバーを作成していますか? TcpListener(.NETソケットよりも速い)を使ってすべてを書く方が良いですが、HttpListenerよりもはるかに遅いです。 私はdisposeのソースをチェックしますが、正しい方法ではありません。データパケット自体で定義されたhttp.sysでフラッシュするかどうか。 – Mash

関連する問題