我正试图对上传到Azure的WebApi进行压力测试。具体来说,此测试用于登录应用程序。我决定使用c#创建一个模拟客户端,并创建一个任务列表,每个任务都会向我的WebApi发送相同的请求。我的问题是,在使用300多个任务后,它将引发异常。
例外:“线程已取消”
内部例外:“对象引用未设置为对象的实例。”
发生异常的代码:await(Task.WhenAll(tasks));
我在测试代码中做错什么了吗?如果是这样,该怎么办?以及如何纠正错误?谢谢!
注意: -我已经尝试过针对API在本地运行测试代码
-该API代码被try catch块包围,并且对它运行测试代码时,它没有达到我在catch块中设置的断点,并且在测试代码中仍然引发了异常。
-因为这是一个正在工作的项目,所以我用替代人代替了真实的登录凭据和API的URL
下面是我的测试代码
public static async Task<decimal> LoginTestParallel3Async(){
Stopwatch timer = new Stopwatch();
var tasks = new List<Task>();
LoginRequestModel request = new LoginRequestModel();
int numOfRequests = 500;
decimal totalTimeForTasks = 0;
string jsonObject = "";
request.UserName = "User";
request.Password = "Password";
request.UserId = 0;
jsonObject = Newtonsoft.Json.JsonConvert.SerializeObject(request);
try
{
using (var client = new HttpClient())
{
for (int i = 0; i < numOfRequests; i++)
{
//tasks.Add(client.PostAsync("URLForAzure", new StringContent(jsonObject, Encoding.UTF8, "application/json")));
tasks.Add(client.PostAsync("URLForLocal", new StringContent(jsonObject, Encoding.UTF8, "application/json")));
}
timer.Start();
await (Task.WhenAll(tasks));
timer.Stop();
totalTimeForTasks = timer.ElapsedMilliseconds;
Console.WriteLine("total time for request: " + totalTimeForTasks + " milliseconds");
Console.ReadLine();
}
}
catch (Exception e)
{
Console.WriteLine(e.Message.ToString());
return totalTimeForTasks;
}
return totalTimeForTasks;
}
答案 0 :(得分:0)
根据文档,默认情况下MaxConnectionsPerServer
中HttpClient
属性的值为256。因此,为了实现所需的功能,必须将此值更改为更大的数字。
例如。
var client = new HttpClient(new HttpClientHandler { MaxConnectionsPerServer = 1000 });