C# HttpWebRequest因应用程序的多个实例而变慢
试图弄清这件事的真相 我有一个非常基本的应用程序,它使用httpwebrequests登录,导航到一个页面,然后获取该页面的html。然后,它在循环中每隔5分钟向第三个页面执行另一个webrequest 它的所有工作都很好,是单线程的(而且相当旧),但是情况已经发生了变化,我现在需要紧密地一起运行这个应用程序的多个实例(我有一个.bat作为临时措施,每2秒启动一次应用程序,直到我能够编写一个新的多线程解决方案为止) 当应用程序启动的第一个实例一切正常时,第一个请求在~2秒内完成。大约3秒钟后第二个 然而,随着越来越多的应用程序同时运行(>100),一些奇怪的事情开始发生 第一个web请求仍然需要约2秒,但是第二个请求延迟超过1分钟,直到超时。我似乎想不出这是为什么。第二个页面比第一个页面大,但下载时间不会超过1分钟 此服务器的internet连接和硬件完全能够处理这些请求C# HttpWebRequest因应用程序的多个实例而变慢,c#,httpwebrequest,C#,Httpwebrequest,试图弄清这件事的真相 我有一个非常基本的应用程序,它使用httpwebrequests登录,导航到一个页面,然后获取该页面的html。然后,它在循环中每隔5分钟向第三个页面执行另一个webrequest 它的所有工作都很好,是单线程的(而且相当旧),但是情况已经发生了变化,我现在需要紧密地一起运行这个应用程序的多个实例(我有一个.bat作为临时措施,每2秒启动一次应用程序,直到我能够编写一个新的多线程解决方案为止) 当应用程序启动的第一个实例一切正常时,第一个请求在~2秒内完成。大约3秒钟后第二
CookieContainer myContainer = new CookieContainer();
// first request is https
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(https://mysite.com/urlone);
request.CookieContainer = myContainer;
request.Proxy = proxy;
Console.WriteLine(System.DateTime.Now.ToLongTimeString() + " " + "Starting login request");
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
Stream resStream = response.GetResponseStream();
string tempString = null;
int count = 0;
do
{
// fill the buffer with data
count = resStream.Read(buf, 0, buf.Length);
// make sure we read some data
if (count != 0)
{
// translate from bytes to ASCII text
tempString = Encoding.ASCII.GetString(buf, 0, count);
// continue building the string
sb.Append(tempString);
}
}
while (count > 0); // any more data to read?
sb.Clear();
response.Close();
resStream.Close();
string output6;
Console.WriteLine(System.DateTime.Now.ToLongTimeString() + " " + "login request comeplete");
HttpWebRequest request6 = (HttpWebRequest)WebRequest.Create(@"http://mysite.com/page2");
request6.CookieContainer = myContainer;
response = (HttpWebResponse)request6.GetResponse();
resStream = response.GetResponseStream();
tempString = null;
count = 0;
do
{
count = resStream.Read(buf, 0, buf.Length);
if (count != 0)
{
tempString = Encoding.ASCII.GetString(buf, 0, count);
sb.Append(tempString);
}
}
while (count > 0);
output6 = sb.ToString();
sb.Clear();
response.Close();
resStream.Close();
有什么想法吗?我不是很先进的http网络请求,所以如果有人可以检查我没有犯任何愚蠢的代码错误以上我感谢它。我不知道我还需要在这里提供什么信息,如果我遗漏了什么,请告诉我,我会尽力提供。
提前谢谢
编辑1:
我用小提琴手找出了问题的根源。问题似乎在于应用程序(或windows)出于某种原因没有发送请求-根据fiddler的说法,实际请求实际上需要<1秒钟。查看一些内容
200-300
尝试使用指令将请求包装到
中,以确保它始终正确关闭。如果达到最大连接数,则必须等待较早的连接超时,然后才能连接新的连接。您是否了解了WireShark在网络级别上的情况?找出什么是限制因素。另外,请使用using
语句,而不是显式调用Close
。大多数web服务器限制来自一台机器的连接数。您可能会遇到此限制。使用fiddler查看发生计时问题的位置。很抱歉,我忘记添加我已经尝试了defaultconnectionlimit,keepalive=true没有任何区别。