3

別のプログラムで実行される HTTP リスナーにデータを送信するクライアント アプリに、以下のコードがあります。

try
{
  using (WebClient client = new WebClient())
  {
     client.Encoding = System.Text.Encoding.UTF8;
     client.Credentials = new NetworkCredential(NotificationUser, NotificationPassword);
     client.UploadString(NotificationUrl, msg);  // Notification URL is IP base not DNS name.
  }
}
catch (Exception ex){}

高負荷環境でテストしており、リクエスト/レスポンスのレイテンシのストレス テストを試みています。両方のプログラムを同じマシンに配置すると、投稿アプリから http リスナー アプリに 1 秒間に約 160 件のメッセージが送信されますが、http リスナー アプリを同じネットワーク (ローカル ネットワーク) 上の別のマシンに配置すると、社内で作成します)、その数は約 5 メッセージ/秒に減少します。

これまでに試したことは次のとおりです。

  1. 2 番目のマシンへの ping は 1 ミリ秒未満で応答することを示し、tracert はホップが 1 つしかないことを示します。2 台のマシン間にファイアウォールやプロキシはありません。
  2. fiddlerStressStimulusを使用して、別のマシンのリスナー アプリにポストする大量のトラフィックを生成したところ、(約 160 メッセージ/秒) を取得しました。私の意見では、これによりネットワークの遅延が除外されるか、リスナー アプリに問題があるかどうかが決まります。
  3. 投稿アプリで UploadString の代わりに UploadStringAsync を使用しようとしましたが、それほど違いはありませんでした。
  4. ウイルス対策などはありません...

奇妙なことに、リスナー アプリが同じマシン上にある場合、この同じコードは正常に動作します。HTTP投稿に制限があること、または私が見落としていることを誰かが知っていますか?

4

1 に答える 1

6

ここで WebClient() と HTTPWebRequest について話している質問を見つけました。したがって、基本的に WebClient() は httpwebRequest の単なるラッパーです。代わりに HTTPWebRequest クラスを使用してコードをテストすることにしました。

try
{
    HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(Program.NotificationUrl);
    request.KeepAlive = false;
    request.Method = "Post";
    request.ContentType = "text/xml";
    request.Credentials = new System.Net.NetworkCredential(Program.NotificationUser, Program.NotificationPassword);

    byte[] data = Encoding.UTF8.GetBytes(msg);

    request.ContentLength = data.Length;
    Stream reqStream = request.GetRequestStream();
    reqStream.Write(data, 0, data.Length);
    reqStream.Close();

    WebResponse response = request.GetResponse();
    using (StreamReader reader = new StreamReader(response.GetResponseStream()))
    {
            reader.ReadToEnd();
    }

}
catch (Exception) 

次に、実際に違いを生んだことがわかったのは、KeepAlive フラグです。デフォルト値が true に設定されている場合、このフラグを false に設定するとすぐに、http ポスト プロセス全体が認証を使用しても非常に高速になりました。WebClient クラスを使用していた場合、このフラグは公開されておらず、デフォルトで値 KeepAlive=true を保持していると想定しました。

うまくいけば、誰かがこの情報が役に立つと思います。

于 2013-01-17T15:01:40.597 に答える