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){}

我们正在高负载环境中对其进行测试,并尝试对请求/响应延迟进行压力测试。如果我将两个程序放在同一台机器上,我会在一秒钟内从发布应用程序发送大约 160 条消息到 http 侦听器应用程序,但是如果我将 http 侦听器应用程序放在同一网络上的不同机器上(本地网络我们在内部创建),这个数字下降到大约 5 条消息/秒。

以下是我们迄今为止所做的尝试:

  1. ping 到第二台机器显示它在不到 1 毫秒的时间内响应,tracert 显示它只有一跳。两台机器之间没有防火墙或代理。
  2. 我使用fiddlerStressStimulus来生成大量流量以发布到另一台机器上的监听器应用程序,我得到了(大约160 条消息/秒)。在我看来,这排除了网络延迟或侦听器应用程序是否存在问题。
  3. 我尝试在发布应用程序中使用 UploadStringAsync 而不是 UploadString,但这并没有太大的不同。
  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) 

Then what we found that really made the different was the flag KeepAlive. With a default value set to true, as soon as we set this flag to false, the whole http post process became lightning fast even with the authentication. If I was using WebClient class, this flag is not exposed to me and I assumed it kept the value KeepAlive=true by default.

Hopefully someone find this information useful down the road.

于 2013-01-17T15:01:40.597 回答