我正在构建一个Web抓取或爬虫C#.NET应用程序,它不断向服务器发送请求以收集一些信息。问题在于,对于特定服务器的某些网页,Web响应总是404未找到。然而令人惊讶的是,我发现只要“Fiddler”正在运行,问题似乎就消失了,并且请求返回并成功响应。自从寻求答案以来,我一直在搜索网页,但没有找到答案。在更光明的一面,在搜索网络并分析Fiddler的时间轴功能后,我得出了一些结论。在缓冲模式下模拟Cid中的提琴手请求#
1.Fiddler在我的应用程序使用流模式时使用缓冲模式加载这些网页。 2.似乎Fiddler重用了连接,换句话说Keep-Alive被设置为true。
现在的问题是我该如何模仿或模拟Fiddler在缓冲模式下加载Web响应的方式,以及Fiddler是否实际执行一些技巧(即修改响应)以获得正确的响应。我使用HttpWebRequest和HttpWebResponse来请求我的页面。在将数据返回给客户端(这是我的服务器)之前,我需要一种完全缓冲httpwebresponse的方法。公共静态字符串getCookie(字符串用户名,字符串密码) { HttpWebRequest request =(HttpWebRequest)WebRequest.Create(“certain link”);
request.UserAgent = "Mozilla/5.0 (Windows NT 6.0; rv:6.0.2) Gecko/20100101 Firefox/6.0.2";
request.Credentials = new NetworkCredential(username, password);
HttpWebResponse wr = (HttpWebResponse)request.GetResponse();
String y = wr.Headers["Set-Cookie"].ToString();
return y.Replace("; path=/", "");
}
/// <summary>
/// Requests the html source of a given web page, using the request credentials given.
/// </summary>
/// <param name="username"></param>
/// <param name="password"></param>
/// <param name="webPageLink"></param>
/// <returns></returns>
public static String requestSource(String username,String password,String webPageLink){
String source = "";
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(webPageLink);
if (username != null && password != null)
{
request.Headers["Cookie"] = getCookie(username, password);
request.UserAgent = "Mozilla/5.0 (Windows NT 6.0; rv:6.0.2) Gecko/20100101 Firefox/6.0.2";
request.Credentials = new NetworkCredential(username, password);
}
StreamReader sr;
using (HttpWebResponse wr = (HttpWebResponse)request.GetResponse())
{
sr = new StreamReader(wr.GetResponseStream());
source = sr.ReadToEnd();
}
return source;
}
FWIW,缓冲不是造成行为改变的原因;还有其他事情正在发生。 FWIW,你真的需要从GetResponseStream返回的对象上调用.Close()。这让很多人翘首以待。 – EricLaw