2011-11-03 102 views
1

我正在编写测试工具来测试HTTP Post。测试用例会在10秒内使用webclient类中的UploadValuesAsync发送8个http请求。它在每8次请求后10秒钟休眠。我正在记录每个请求的开始时间和结束时间。当我计算平均响应时间。我正在800毫秒左右。但是当我使用web客户端中的UploadValues方法同步运行此测试用例时,我的平均响应时间为250毫秒。你能告诉我为什么这两种方法有区别吗?我期待Aync的响应时间更短,但我没有那样做。UploadValuesAsync响应时间

这里是代码发送8个请求异步

     var count = 0; 
     foreach (var nameValueCollection in requestCollections) 
     { 
      count++; 
      NameValueCollection collection = nameValueCollection; 
      PostToURL(collection,uri); 
      if (count % 8 == 0) 
      { 
       Thread.Sleep(TimeSpan.FromSeconds(10)); 
       count = 0; 
      } 
     } 

修订 这里是发送8个请求SYNC

public void PostToURLSync(NameValueCollection collection,Uri uri) 
    { 
     var response = new ServiceResponse 
     { 
      Response = "Not Started", 
      Request = string.Join(";", collection.Cast<string>() 
             .Select(col => String.Concat(col, "=", collection[col])).ToArray()), 
      ApplicationId = collection["ApplicationId"] 

     }; 

     try 
     { 
      using (var transportType2 = new DerivedWebClient()) 
      { 
       transportType2.Expect100Continue = false; 
       transportType2.Timeout = TimeSpan.FromMilliseconds(2000); 
       response.StartTime = DateTime.Now; 
       var responeByte = transportType2.UploadValues(uri, "POST", collection); 
       response.EndTime = DateTime.Now; 
       response.Response = Encoding.Default.GetString(responeByte); 
      } 

     } 
     catch (Exception exception) 
     { 
      Console.WriteLine(exception.ToString()); 
     } 
     response.ResponseInMs = (int)response.EndTime.Subtract(response.StartTime).TotalMilliseconds; 
     responses.Add(response); 
     Console.WriteLine(response.ResponseInMs); 
    } 

这里代码是张贴到HTTP URI

代码
public void PostToURL(NameValueCollection collection,Uri uri) 
    { 
     var response = new ServiceResponse 
         { 
          Response = "Not Started", 
          Request = string.Join(";", collection.Cast<string>() 
                 .Select(col => String.Concat(col, "=", collection[col])).ToArray()), 
          ApplicationId = collection["ApplicationId"] 

         }; 

     try 
     { 
      using (var transportType2 = new DerivedWebClient()) 
      { 
       transportType2.Expect100Continue = false; 
       transportType2.Timeout = TimeSpan.FromMilliseconds(2000); 
       response.StartTime = DateTime.Now; 
       transportType2.UploadValuesCompleted += new UploadValuesCompletedEventHandler(transportType2_UploadValuesCompleted); 
       transportType2.UploadValuesAsync(uri, "POST", collection,response); 
      } 
     } 
     catch (Exception exception) 
     { 
      Console.WriteLine(exception.ToString()); 
     } 
    } 

这是uplo广告完成的事件

private void transportType2_UploadValuesCompleted(object sender, UploadValuesCompletedEventArgs e) 
    { 
     var now = DateTime.Now; 
     var response = (ServiceResponse)e.UserState; 
     response.EndTime = now; 
     response.ResponseInMs = (int) response.EndTime.Subtract(response.StartTime).TotalMilliseconds; 
     Console.WriteLine(response.ResponseInMs); 

     if (e.Error != null) 
     { 
      response.Response = e.Error.ToString(); 
     } 
     else 
     if (e.Result != null && e.Result.Length > 0) 
     { 
      string downloadedData = Encoding.Default.GetString(e.Result); 
      response.Response = downloadedData; 
     } 
     //Recording response in Global variable 
     responses.Add(response); 
    } 
+0

您要发送的收藏有多大?难道是在使用异步时,你并行发送所有请求,但同步版本发送一个请求之后?你可以发布你的同步代码吗? – svick

+0

我测试的@svick集合包含100个对象。更新了同步代码。 – Amzath

回答

0

正如贾斯汀所说,我尝试了ServicePointManager.DefaultConnectionLimit,但没有解决问题。我无法再现贾斯汀提出的其他问题。我不知道如何在第一时间重现它们。

我做了什么,我在对等机器上运行了相同的代码,运行完美的响应时间,我期望。两台机器的区别在于操作系统。我在Windows Server 2003上运行,其他机器在Windows Server 2008上运行。

由于它在其他机器上工作,我怀疑它可能是Justin指定的问题之一,或者可能是2003年或其他机器上的服务器设置。之后,我没有花太多时间来挖掘这个问题。由于这是我们在这个问题上优先考虑的测试工具。我们没有更进一步就离开了。

由于我没有确切地修复它的内容,我不接受除此之外的任何答案。因为至少我知道切换到服务器2008年解决了这个问题。

2

一个问题,你可能运行到的是,.NET,默认情况下,将油门到由相关RFC规定的上限(每远程主机2个并发连接)传出的HTTP连接。假设每个请求有2个并发连接和250ms,这意味着前2个请求的响应时间将为250ms,第2个响应时间为500ms,第3个750ms和最后1000ms。这将产生625ms的平均响应时间,这与您所看到的800毫秒相差不远。

要删除限制,请将ServicePointManager.DefaultConnectionLimit增加到您希望支持的最大并发连接数,并且您应该会看到您的平均响应时间缩短了很多。

第二个问题可能是服务器本身处理多个并发连接的速度低于一次处理一个请求的速度。即使您解开上面的限制问题,我也希望每个异步请求的平均执行速度要比服务器一次只执行一个请求的速度慢一些。速度有多慢取决于服务器对并发请求的优化程度。

最后的问题可能是由测试方法引起的。例如,如果您的测试客户端通过存储Cookie并重新发送每个请求的cookie来模拟浏览器会话,那么可能会遇到一些服务器的问题,这些服务器会将来自单个用户的请求序列化。这通常是服务器应用程序的简化,所以他们不必处理锁定交叉请求状态,如会话状态。如果您遇到此问题,请确保每个WebClient发送不同的Cookie来模拟不同的用户。

我并不是说你遇到了所有这三个问题 - 你可能只会碰到1或2个问题 - 但这些是你所看到的问题最可能的罪魁祸首。