UploadValuesAsync响应时间

本文关键字:响应时间 UploadValuesAsync | 更新日期: 2023-09-27 18:13:32

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

下面是发送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());
        }
    }

这是上传完成的事件

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

UploadValuesAsync响应时间

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

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

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

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

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

正如Justin所说,我尝试了ServicePointManager。DefaultConnectionLimit,但这并没有解决问题。我无法重现Justin提出的其他问题。首先,我不确定如何复制它们。

我所做的是,我在另一台机器上运行相同的代码段,它的响应时间完全符合我的预期。这两台机器的不同之处在于操作系统。我的电脑运行的是Windows Server 2003,其他电脑运行的是Windows Server 2008。

当它在其他机器上工作时,我怀疑它可能是Justin指定的问题之一,或者可能是2003年的服务器设置或其他东西。在那之后,我没有花太多时间去挖掘这个问题。由于这是一个测试工具,我们在这个问题上的优先级很低。我们没有时间再往前走了。

因为我没有胶水到底是什么固定它,我不接受任何答案以外的这个。因为至少我知道切换到server 2008修复了这个问题。