在上篇筆記中
描述了在C#中如何使用HttpWebRequest
HttpWebResponse登錄簡單網站
但如果用同樣的方法去訪問一個需要登錄後才能訪問的頁面
會出現什麼結果呢?讓我們先來嘗試一下!
嘗試一
在上篇筆記中
創建了一個用於測試的簡單網站
其中LoginSuccess
aspx頁面是需要登錄後才能訪問的(沒登錄的用戶訪問該頁面
會被重定向到default
aspx頁面)
這裡我們調用GetHtml(
x
)來直接訪問LoginSuccess
aspx頁面
同時用HTTP Analyzer抓包
(圖一)
從抓包截圖(圖一)上可以看到
當程序訪問LoginSuccess
aspx頁面時
被重定向到default
aspx頁面去了
證明不能直接訪問
嘗試二
那麼是不是用程序先在defaul
aspx中登錄後在訪問LoginSuccess
aspx頁面就OK了呢?我們再來嘗試一下
調用GetHtml(
x
postData
Method
POST)登錄
調用GetHtml(
x
)訪問LoginSuccess
aspx頁面
(圖二)
圖二是第二次嘗試中庸HTTP Analyzer抓包的截圖
程序在Default
aspx中登錄成功後
自動跳轉至LoginSuccess
aspx
程序在登錄成功後
訪問LoginSuccess
aspx頁面
被重定向到Default
aspx
看來這次的嘗試又失敗了
然道沒辦法在程序中訪問需登錄後才能訪問的頁面了嗎?答案是否定的!那麼該如何實現呢?在實現前
有一些基礎知識是要先了解的
哈哈
原來是Cookie的原因啊!看來我們只需在訪問需登錄的頁面時把該網站對應的Cookie帶上就OK了
這裡使用CookieContainer來保存Cookie
嘗試三
給HttpWebRequest指定CookieContainer
登錄並訪問LoginSuccess
aspx頁面
以下是修改後的代碼
CookieContainer cookieContainer = new CookieContainer(); // 聲明CookieContainer對象
// 登錄網站
HttpWebRequest loginHttpWebRequest = (HttpWebRequest)HttpWebRequest
Create(
x
);
loginHttpWebRequest
CookieContainer = cookieContainer; // 給HttpWebRequest指定CookieContainer
byte[] byteRequest = Encoding
Default
GetBytes(postData);
loginHttpWebRequest
ContentType = contentType;
loginHttpWebRequest
Referer =
x
;
loginHttpWebRequest
Accept = accept;
loginHttpWebRequest
UserAgent = userAgent;
loginHttpWebRequest
Method =
POST
;
loginHttpWebRequest
ContentLength = byteRequest
Length;
Stream stream = loginHttpWebRequest
GetRequestStream();
stream
Write(byteRequest
byteRequest
Length);
stream
Close();
loginHttpWebRequest
GetResponse();
// 訪問LoginSuccess
aspx
HttpWebRequest httpWebRequest = (HttpWebRequest)HttpWebRequest
Create(
x
);
;= cookieContainer; // 給HttpWebRequest指定CookieContainer
();
下圖是抓包截圖
(圖三)
注意和圖二的區別
少了個
這就說明
程序成功訪問了需登錄後才能訪問的頁面LoginSuccess
aspx
點擊下載示例代碼(VS
)
From:http://tw.wingwit.com/Article/program/net/201311/13858.html