我正在構建一個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