最近在做一個項目,因為是分層設計,為了各層之間解耦,我們采用了HttpWebRequest來抓取同域下 的文件數據(動態生成的)來生成新的對象.我們生成數據頁的handler都是以.do結尾的,以示區分.但是 這也帶來了問題,在使用HttpWebRequest抓數據時,通不過驗證.但是我們使用AJAX同樣也是.do結尾的啊, 卻可以使用,奇怪!網上找Membership的驗證原理,資料及其缺乏.多是設置cookie之類的,也試了好多次,均 不奏效!事實也證明,當我們禁用cookie時,membership認證也同樣起作用,設置cooke這條路走不通.陷入僵 局!
只好在分析,為什麼ajax請求行?而HttpWebRequest請求就不行呢?有什麼特殊情況.打開我們經典的調 試分析工具fiddler2.0,看看ajax傳了什麼
看到有.User一節的時候,我們眼睛一亮.或許給請求的頭加上一個.User一節就能認證了,說做就做
HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create (requestUrl);
request.Method = "POST";
request.ContentType = "application/x-www-form-urlencoded;charset=UTF-8;";
request.Headers.Add(string.Format("Cookie:.User={0}", FormsAuthentication.GetAuthCookie(HttpContext.Current.User.Identity.Name, false).Value));
using (Stream stream = request.GetRequestStream())
{
using (StreamWriter sw = new StreamWriter(stream))
{
sw.Write(param);
}
}
string json = string.Empty;
using (Stream stream = request.GetResponse().GetResponseStream())
{
using (StreamReader sr = new StreamReader(stream, Encoding.UTF8))
{
json = sr.ReadToEnd();
}
}
運行,調試,全部通過,大功告成!
同理,如果碰到membership認證的網站,想抓網頁,可以先注冊一個用戶,然後用fiddler查看用戶 的.User這一節,加入你程序的頭裡,就能通過驗證了
總結:為什麼ajax能抓,而HttpWebRequest不能抓,原因可能是ajax是使用的js調用,而js是aspx頁面的 一部分,aspx頁面的請求當然能使用membership.而HttpWebRequest直接請求的是.do頁面,不受.net管 理.