【发布时间】:2014-07-24 04:59:06
【问题描述】:
我正在编写一个多线程网络爬虫,它每秒使用数百个线程执行大量并发 httpwebrequests,应用程序运行良好,但有时(随机)其中一个网络请求挂在 getResponseStream() 上,完全忽略了超时(当我同时执行数百个请求时会发生这种情况)使得爬取过程永远不会结束,奇怪的是,对于 fiddler,这永远不会发生并且应用程序永远不会挂起,真的很难调试,因为它是随机发生的。
我试过设置
保活 = 假
ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3;
但我仍然有奇怪的行为,有什么想法吗?
谢谢
HttpWebRequest 代码:
public static string RequestHttp(string url, string referer, ref CookieContainer cookieContainer_0, IWebProxy proxy)
{
string str = string.Empty;
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
request.AutomaticDecompression = DecompressionMethods.Deflate | DecompressionMethods.GZip;
request.UserAgent = randomuseragent();
request.ContentType = "application/x-www-form-urlencoded";
request.Accept = "*/*";
request.CookieContainer = cookieContainer_0;
request.Proxy = proxy;
request.Timeout = 15000;
request.Referer = referer;
//request.ServicePoint.MaxIdleTime = 15000;
using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
{
using (Stream responseStream = response.GetResponseStream())
{
List<byte> list = new List<byte>();
byte[] buffer = new byte[0x400];
int count = responseStream.Read(buffer, 0, buffer.Length);
while (count != 0)
{
list.AddRange(buffer.ToList<byte>().GetRange(0, count));
if (list.Count >= 0x100000)
{
break;
}
count = 0;
try
{
HERE IT HANGS SOMETIMES ---> count = responseStream.Read(buffer, 0, buffer.Length);
continue;
}
catch
{
continue;
}
}
//responseStream.Close();
int num2 = 0x200 * 0x400;
if (list.Count >= num2)
{
list.RemoveRange((num2 * 3) / 10, list.Count - num2);
}
byte[] bytes = list.ToArray();
str = Encoding.Default.GetString(bytes);
Encoding encoding = Encoding.Default;
if (str.ToLower().IndexOf("charset=") > 0)
{
encoding = GetEncoding(str);
}
else
{
try
{
encoding = Encoding.GetEncoding(response.CharacterSet);
}
catch
{
}
}
str = encoding.GetString(bytes);
// response.Close();
}
}
return str.Trim();
}
【问题讨论】:
标签: c# multithreading httpwebrequest fiddler freeze