首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >UploadValuesAsync响应时间

UploadValuesAsync响应时间
EN

Stack Overflow用户
提问于 2011-11-03 18:32:41
回答 2查看 2.1K关注 0票数 1

我正在编写测试工具来测试HTTP。测试用例将在10秒间隔内使用webclient类中的UploadValuesAsync发送8个http请求。每8次请求,它就会睡上10秒。我正在记录每个请求的开始时间和结束时间。当我计算平均响应时间时。我大约有800毫秒。但是,当我在web客户端中使用UploadValues方法同步运行这个测试用例时,我的平均响应时间是250毫秒。你能告诉我这两种方法为什么不同吗?我原以为Aync的响应时间会更短,但我并没有明白这一点。

下面是发送8个请求异步的代码

代码语言:javascript
复制
                       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个请求同步的代码

代码语言:javascript
复制
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的代码

代码语言:javascript
复制
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());
        }
    }

以下是上传完成的事件

代码语言:javascript
复制
    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);
    }
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-01-12 19:36:06

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

我所做的是,我在对等机器中运行了与我预期的完全相同的响应时间的代码。这两台机器的区别在于操作系统。我的机器运行在Windows 2003上,其他机器运行在Windows 2008上。

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

由于我没有胶水到底是什么固定的,我不会接受任何答案,除了这个。因为至少我知道切换到服务器2008解决了这个问题。

票数 0
EN

Stack Overflow用户

发布于 2011-11-19 22:49:37

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

若要删除节流,请将ServicePointManager.DefaultConnectionLimit提高到您希望支持的并发连接的最大数量,您应该会看到平均响应时间大幅下降。

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

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

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8000107

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档