试图深入了解这一点!
我有一个非常基本的应用程序,使用httpwebrequests登录,导航到一个页面,然后抓取该页面的HTML。然后它会在循环中每隔5分钟将另一个webrequest预制成第三页。
它的工作正常并且是单线程的(并且相当陈旧),但是情况已经改变了,我现在需要紧密地运行这个应用程序的多个实例(我有一个.bat每隔2秒启动应用程序作为临时措施,直到我能够编写一个新的多线程解决方案)。
当应用程序的第一个实例开始一切正常时,第一个请求在~2秒内完成。第二个在大约3秒内。
然而,随着越来越多的这个应用程序的实例同时运行(> 100),一些奇怪的事情开始发生。第一个Web请求仍然需要约2秒,但是第二个请求会延迟更多> 1分钟到达超时点。我似乎无法想到为什么会这样。第二页比第一页大,但没有什么不寻常的下载需要> 1分钟。
此服务器的互联网连接和硬件非常能够处理这些请求。
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网络请求,所以如果有人可以检查我没有做任何愚蠢的代码错误以上id欣赏它。我不知道我可能需要包括哪些其他信息,如果我错过了任何事情请告诉我,我会尽我所能提供。 提前谢谢。
编辑1:
我用fiddler找出问题的根源。看起来问题在于应用程序(或窗口)由于某种原因没有发送请求 - 物理请求实际上需要<根据小提琴手1秒钟。
答案 0 :(得分:2)
查看一些内容
ServicePointManager.DefaultConnectionLimit
:如果您打算打开超过100个连接,请将此值设置为200-300
。HttpWebRequest.KeepALive = true
答案 1 :(得分:0)
尝试将您的请求包装到using
指令中,以确保它始终正确关闭。如果达到最大连接数,则必须等待先前的连接超时才能连接新连接。