C# 对同一http主机的多个同时请求
我有一个C#桌面应用程序,它需要同时向同一个web服务器发出多个http请求。下面是我执行的测试,以检查我的请求是否确实同时发生:C# 对同一http主机的多个同时请求,c#,.net,http,asynchronous,C#,.net,Http,Asynchronous,我有一个C#桌面应用程序,它需要同时向同一个web服务器发出多个http请求。下面是我执行的测试,以检查我的请求是否确实同时发生: 在web服务器上,创建一个休眠3秒的测试页面(模拟一些长时间运行的任务),然后返回当前日期/时间。下面是代码(VB.Net): 在C#应用程序中,我有一个函数MakeRequest(),它使用System.Net.Http.HttpClient发出web请求,并以字符串形式返回响应 然后在C#应用程序中,有一个通过单击按钮调用的函数,该函数异步调用MakeReq
这是C#app的代码。这是一个WinForms应用程序,代码存在于表单类中:
<!-- language: lang-c# -->
private HttpClient _httpClient = new HttpClient();
private async void button1_Click(object sender, EventArgs e)
{
ServicePointManager.DefaultConnectionLimit = 1000000;
var sw = Stopwatch.StartNew();
var responses = await Task.WhenAll(MakeRequest(), MakeRequest(), MakeRequest());
sw.Stop();
var msg = String.Join("\r\n", responses) + "\r\n\r\nTime Elapsed: " + sw.ElapsedMilliseconds;
MessageBox.Show(msg);
}
private async Task<string> MakeRequest()
{
using (var message = await _httpClient.GetAsync("http://TestServer/TestPage.aspx"))
{
return await message.Content.ReadAsStringAsync();
}
}
私有HttpClient _HttpClient=新HttpClient();
私有异步无效按钮1\u单击(对象发送方,事件参数e)
{
ServicePointManager.DefaultConnectionLimit=1000000;
var sw=Stopwatch.StartNew();
var responses=wait Task.WhenAll(MakeRequest(),MakeRequest(),MakeRequest());
sw.Stop();
var msg=String.Join(“\r\n”,responses)+”\r\n\r\n运行时间:“+sw.elapsedmillyses;
MessageBox.Show(msg);
}
专用异步任务MakeRequest()
{
使用(var message=await _httpClient.GetAsync(“http://TestServer/TestPage.aspx"))
{
返回wait message.Content.ReadAsStringAsync();
}
}
两个原因:
谢谢你的回复。1.是的,我遇到了这个问题,所以将网页移动到Win Server 2008上的IIS。事实上,我也试着在Server2008上运行发送请求的MVC页面——与从Win10运行的结果相同。2.不知道为什么我的客户端代码会被同步删除。我在原始问题中发布了代码。你能建议我如何修改它吗?代码很好。你能发布一次完成60个请求的代码吗?顺便说一句,ASP.NET线程池将因所有这些同步等待而过载。使用异步mvc操作并使用
await Task.Delay
。一次执行60个请求的代码与上面发布的代码相同,但行var responses=await Task.whalll(MakeRequest(),MakeRequest(),MakeRequest())中的代码除外代码>重复MakeRequest()
60次。关于ASP.Net线程池过载,我认为不会发生这种情况,因为当我的客户端应用程序最终同时发送60个请求时,web服务器会成功地同时处理所有请求。检查此处:,部分“为IIS 7.5/7.0集成模式配置ASP.NET 4 MaxConcurrentRequests”“当我的客户端应用程序最终发送时”“您如何知道它们在所有情况下都没有发送,但服务器处理它们的速度很慢?”?有许多性能计数器,有些是误导性的。使用一个异步mvc操作并使用wait Task.Delay,这样我们就可以消除我的猜测。好的,将服务器端更改为异步管道确实改变了一些事情。我把它改成:
。现在,单击第一个按钮可以直接发送5个左右的请求,然后开始一次发送一个请求。在服务器上,每秒请求数首先显示一个小峰值,