2009-08-13 17 views
1

状況:msdnに記載されているようにHttpWebRequest.BeginGetResponseを使用していました。 10秒ごとにリクエストを送信するタイマーがありました。私はそれをテストしたときにxml構造の情報を受け取りました。タイマの非同期HttpWebRequest問題

結果:お客様の場所にいて、そのツールを実行していると、不完全な(したがって解析できない)xml(それぞれ約4KB)が届きました。私はブラウザをチェックインして完全に見ることができました(明らかにブラウザからの同期リクエスト?!)。コンテンツの長さに関するヘッダー情報を使用して、受信バッファのサイズを調整しました。

何が原因でしたか?知りません。データはかなり小さいです。それでも私はdeveloper fusionに記載されたThreadPool.RegisterWaitForSingleObjectのアプローチを使用してタイムアウトを定義しました。タイムアウトのために10秒も選択しました。たぶんそれは賢明な決定ではなかった、おそらくそれはタイマーの間隔よりも小さくなるはずです。事は、私はそれらの条件の下で再びテストすることはできません。私はネットワーク設定について洞察していなかった生産現場にいました。レギュュストは家庭から同時にうまくいった。

私はその分野で経験はあまりありませんが、レスポンスストリームが完全に受信される前にタイマーが新しいリクエストをトリガーするとどうなりますか?タイムアウト時間はタイマー間隔に等しいか?ここでボトルネックになる可能性のある他のヒント?

答えて

1

チャンクていることを確認してください?あなたはストリームを通してデータを読んでいますか?そして、Stream.Readへの入力パラメータとして返されるcontentsizeを使用していますか? Stream.Readの機能は完全には明白ではありません。要求されたデータ量を返すことが保証されていないことです。 次の機能

public abstract int Read(byte[] buffer, int offset, int count) 

を呼び出すと、それは実際に読み込まれたどのくらいのデータが返されます。だからあなたは1000を読んでそれを400に戻すように依頼するかもしれません。 これは、0を返すまで(ストリームにデータがないことを意味する)Readを呼び出す必要があることを意味します。

また、コンテンツ長のヘッダー情報をバッファのサイズに使用しないでください。その代わりに、(例えばMemoryStreamオブジェクトを使用して)動的にサイズの変更されたバッファを作成し、0を返すまでレスポンスストリームから読み込む必要があります。少なくとも、これはどうやって行うのですか。サーバーが実装を変更しても応答ヘッダーが送信されない場合、ソリューションは引き続き機能します。 さらに、XMLを読み込んでXmlDocumentを作成し、Http応答ストリームから直接ロードするように依頼するので、さらに優れています。

+0

そのヒントありがとう、私は実際にStream.Readメソッドを悪用しているようです。 – rdoubleui

1

解決策は簡単です。応答の処理が完了したら、タイマーを開始してください。

+0

私はそれがすべて私が必要と思う。それは私がそれを世話する必要があるかどうかを言って、私が意味するものに答えました。私はちょうど私が10秒で4KBを受け取ることができなかったと信じられませんでした。 – rdoubleui

+0

しかし、私はタイマーが一定の間隔を制御するのに役に立たないでしょう。たぶん私は接続の品質に依存するので、私はそれらの間隔に私のアプリケーションを強制するべきではない.. – rdoubleui

0

接続先のサーバーが異なる場合は、サーバーからの応答も「チャンク」になる可能性があります。 httpwebrequestには、チャンクされたサーバー上で完全なファイルを返さないバグがあります。

この場合、httpトラフィックに対して「チャンクモード」が有効になっていないことを確認してください。

これが届かない場合は、通常のソケットを使用してリクエストを行い、httpリクエストを送信して、完全な結果を返します。このルートに行く前に

は、まず、これはどのようにデータを受信して​​いるモードは、ここで問題です

R

+0

チャンクモードもオプションになるだろう、私はそれについてさらに調べてみるつもりです。それは何とかそのネットワーク上のトラフィックにリンクされなければならないが、私が言ったように、それは同じ時間に自宅の別のPCから働いたからだ。私は何かを見つけたらフィードバックをお寄せください。 – rdoubleui