发布到同一网络上的另一台计算机时,使用WebClient.UploadString的HTTP Post非常慢

时间:2013-01-16 15:37:34

标签: c# http http-post

我们在客户端应用程序中有一个代码,它将数据发布到另一个程序上运行的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. 没有防病毒等......
  5. 奇怪的是,如果侦听器应用程序位于同一台计算机上,则相同的代码正常工作。有谁知道HTTP帖子有任何限制或我忽略的东西?

1 个答案:

答案 0 :(得分:6)

我在这里找到了一个question来讨论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 post进程也会变得非常快。如果我使用的是WebClient类,那么这个标志不会暴露给我,我认为它默认保持值KeepAlive = true。

希望有人发现这些信息在路上很有用。