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);
}
您可能遇到的一个问题是,在默认情况下,. 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修复了这个问题。