熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> .NET編程 >> 正文

C#網站(二):訪問需登錄後才能訪問

2013-11-13 10:30:41  來源: .NET編程 
     在上篇筆記中描述了在C#中如何使用HttpWebRequestHttpWebResponse登錄簡單網站但如果用同樣的方法去訪問一個需要登錄後才能訪問的頁面會出現什麼結果呢?讓我們先來嘗試一下!

    嘗試一在上篇筆記中創建了一個用於測試的簡單網站其中LoginSuccessaspx頁面是需要登錄後才能訪問的(沒登錄的用戶訪問該頁面會被重定向到defaultaspx頁面)這裡我們調用GetHtml(x)來直接訪問LoginSuccessaspx頁面同時用HTTP Analyzer抓包

(圖一)
    從抓包截圖(圖一)上可以看到當程序訪問LoginSuccessaspx頁面時被重定向到defaultaspx頁面去了證明不能直接訪問

    嘗試二那麼是不是用程序先在defaulaspx中登錄後在訪問LoginSuccessaspx頁面就OK了呢?我們再來嘗試一下 調用GetHtml(x postData MethodPOST)登錄調用GetHtml(x)訪問LoginSuccessaspx頁面

(圖二)
    圖二是第二次嘗試中庸HTTP Analyzer抓包的截圖程序在Defaultaspx中登錄成功後自動跳轉至LoginSuccessaspx程序在登錄成功後訪問LoginSuccessaspx頁面被重定向到Defaultaspx看來這次的嘗試又失敗了

    然道沒辦法在程序中訪問需登錄後才能訪問的頁面了嗎?答案是否定的!那麼該如何實現呢?在實現前有一些基礎知識是要先了解的
以下文字轉自深藍的博客文章《使用C#實現網站用戶登錄》

  HTTP協議是一個無連接的協議也就是說這次對話的內容和狀態與上次的無關為了實現和用戶的持久交互網站與浏覽器之前在剛建立會話時將在服務器內存中建立一個Session該Session標識了該用戶(浏覽器)每一個Session都有一個唯一的ID第一次建立會話時服務器將生成的這個ID傳給浏覽器浏覽器在接下來的浏覽中每一個發向服務器的請求中都將包含該SessionID從而標識了自己的身份

  服務器上是使用內存來保存Session中的信息那麼浏覽器又使用什麼來保存服務器分配的這個SessionID了?對是Cookie在剛建立會話時浏覽器向服務器的請求中將不包含SessionID在Cookie中服務器就認為是一個全新的會話從而在服務器上分配一段內存給該 Session用同時將該Session的ID在Http Header中使用SetCookie發送給浏覽器


    哈哈原來是Cookie的原因啊!看來我們只需在訪問需登錄的頁面時把該網站對應的Cookie帶上就OK了這裡使用CookieContainer來保存Cookie

    嘗試三給HttpWebRequest指定CookieContainer登錄並訪問LoginSuccessaspx頁面

    以下是修改後的代碼

CookieContainer cookieContainer = new CookieContainer(); // 聲明CookieContainer對象

// 登錄網站
HttpWebRequest loginHttpWebRequest = (HttpWebRequest)HttpWebRequestCreate(x);
loginHttpWebRequestCookieContainer = cookieContainer; // 給HttpWebRequest指定CookieContainer

byte[] byteRequest = EncodingDefaultGetBytes(postData);
loginHttpWebRequestContentType = contentType;
loginHttpWebRequestReferer = x;
loginHttpWebRequestAccept = accept;
loginHttpWebRequestUserAgent = userAgent;
loginHttpWebRequestMethod = POST;
loginHttpWebRequestContentLength = byteRequestLength;

Stream stream = loginHttpWebRequestGetRequestStream();
streamWrite(byteRequest  byteRequestLength);
streamClose();

loginHttpWebRequestGetResponse();

// 訪問LoginSuccessaspx
HttpWebRequest httpWebRequest = (HttpWebRequest)HttpWebRequestCreate(x);
;= cookieContainer; // 給HttpWebRequest指定CookieContainer
(); 
    下圖是抓包截圖

(圖三)
    注意和圖二的區別少了個這就說明程序成功訪問了需登錄後才能訪問的頁面LoginSuccessaspx

    點擊下載示例代碼(VS

From:http://tw.wingwit.com/Article/program/net/201311/13858.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.