0

http を介した永続的な接続を使用するアプリを作成しています。つまり、Web サーバーは応答ストリームへの書き込みを「終了」せず、クライアント アプリは応答ストリームからデータを読み取ります。

サーバーとクライアントのコードが機能することを確認するために、いくつかの .NET 3.5 デスクトップ/winforms アプリを作成してから、同じことを行う Windows Phone アプリを作成しました。デスクトップ コードと電話コードの唯一の違いは、電話で AllowReadStreamBuffering プロパティを false に設定したことです。

電話アプリは昨夜は機能しましたが、今日は機能しません。応答ストリームを読み取ろうとすると、接続がサーバー側から閉じられるまでハングします。これは、AllowReadStreamBuffering 設定が HttpWebRequest によって受け入れられていないことを意味します。

昨夜と今の違いは、昨夜は Wi-Fi を使用していたのに対し、今日はセルラーで接続していることです。

私の仮説は、電話では、接続が wifi (およびおそらくイーサネット) の場合、HttpWebRequest は AllowReadStreamBuffering = false のみを尊重し、セルラー ネットワークを使用する場合はそれを無視してバッファリングするというものです。

HttpWebRequest がセルラー経由で接続されている場合に読み取りストリームのバッファリングを強制するのは本当ですか? この動作を確認するドキュメントを見つけることができなかったので、他の誰かがこれを経験したかどうか疑問に思っています. 後でこれをより徹底的にテストできるようになりますが、今のところ、質問することにしました。

更新 5-11-12
自分の質問をテストして回答しました (以下を参照)

4

2 に答える 2

0

AllowReadStreamBuffering = falseは、セルラー接続で尊重されます。そうしないと(たとえば)オーディオストリーミングアプリが正しく機能しません。

于 2012-05-10T15:51:12.487 に答える
0

セルラー経由で接続されている場合、WP7アプリが最初はバッファリングされていない応答ストリームを読み取らないことを確認しました-イーサネットまたはwifiでのみ読み取ります.

そこで、サーバーの httphandler を変更して、接続の開始時に最初のデータ チャンク (8k) を応答ストリームに書き込みました。これを行うと、wifi のときと同じように、アプリはセルラーですぐに応答ストリームを読み取るようになりました。最初の大量のデータを無視した後、アプリは個々のバイトを問題なく、リアルタイムで処理しました。

私が考えることができる唯一の結論は、セルラー経由で接続されている場合、HttpWebRequest は最初に少量のデータをバッファリングしてから、ストリームをバッファリングなしで読み取れるようにする必要があるということです。

于 2012-05-11T14:24:10.173 に答える