C# 使用HttpWebRequest提交ASP.NET表单并保持Session和Cookie
生活随笔
收集整理的這篇文章主要介紹了
C# 使用HttpWebRequest提交ASP.NET表单并保持Session和Cookie
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
由于種種原因,我們有時需要從互聯網上抓取一些資料,有些頁面可以直接打開,而有些頁面必登錄之后才能打開。本文介紹的是使用 HttpWebRequest 和 HttpWebResponse 自動填寫提交 ASP.NET 表單并保持 Session 和 Cookie 的一個完整的例子。
這里涉及到3個頁面:MyLogin.aspx,LoginOK.htm,Default.aspx:
1)MyLogin.aspx 頁面
MyLogin.aspx 頁面是登錄頁面,如果用戶名和密碼正確會生成 Session 和 Cookie(LoginSession、LoginCookie),然后轉向 LoginOK.htm 頁面。
2)LoginOK.htm 頁面
LoginOK.htm 頁面是一個跳轉頁面,幾秒鐘后會自動跳轉到 Default.aspx 頁面。
3)Default.aspx 頁面
Default.aspx 頁面是主界面,打開主界面時會判斷 LoginSession 和 LoginCookie 的值是否正確,并把 Session 和 Cookie 的值顯示出來。
提交ASP.NET表單(即完成自動登錄)的代碼如下:
try
???? {
????????CookieContainer cookieContainer = new CookieContainer();
????????///
????????// 1. 打開 MyLogin.aspx 頁面,獲得 GetVeiwState & EventValidation
????????///????????????????
????????// 設置打開頁面的參數
????????string URI = "http://localhost:1165/WebTest/MyLogin.aspx";
???????? HttpWebRequest request = WebRequest.Create(URI) as HttpWebRequest;
???????? request.Method = "GET";
???????? request.KeepAlive = false;
????????// 接收返回的頁面
???????? HttpWebResponse response = request.GetResponse() as HttpWebResponse;
???????? System.IO.Stream responseStream = response.GetResponseStream();
???????? System.IO.StreamReader reader = new System.IO.StreamReader(responseStream,Encoding.UTF8);
????????string srcString = reader.ReadToEnd();
????????// 獲取頁面的 VeiwState????????????????
????????string viewStateFlag = "id=\"__VIEWSTATE\" value=\"";
????????int i = srcString.IndexOf(viewStateFlag) + viewStateFlag.Length;
????????int j = srcString.IndexOf("\"", i);
????????string viewState = srcString.Substring(i, j - i);
????????// 獲取頁面的 EventValidation????????????????
????????string eventValidationFlag = "id=\"__EVENTVALIDATION\" value=\"";
???????? i = srcString.IndexOf(eventValidationFlag) + eventValidationFlag.Length;
???????? j = srcString.IndexOf("\"", i);
????????string eventValidation = srcString.Substring(i, j - i);
///
????????// 2. 自動填充并提交 MyLogin.aspx 頁面
???????? ///
???????? // 提交按鈕的文本
???????? string submitButton = "登錄"; // 用戶名和密碼
???????? string userName = "1";
???????? string password = "1"; // 將文本轉換成 URL 編碼字符串
???????? viewState = System.Web.HttpUtility.UrlEncode(viewState);
???????? eventValidation = System.Web.HttpUtility.UrlEncode(eventValidation);
???????? submitButton = System.Web.HttpUtility.UrlEncode(submitButton); // 要提交的字符串數據。格式形如:user=uesr1&password=123
???????? string formatString =
????????????????? "userName={0}&password={1}&loginButton={2}&__VIEWSTATE={3}&__EVENTVALIDATION={4}";
???????? string postString =
????????????????? string.Format(formatString, userName, password, submitButton, viewState, eventValidation); // 將提交的字符串數據轉換成字節數組
???????? byte[] postData = Encoding.ASCII.GetBytes(postString); // 設置提交的相關參數
???????? request = WebRequest.Create(URI) as HttpWebRequest;
???????? request.Method = "POST";
???????? request.KeepAlive = false;
???????? request.ContentType = "application/x-www-form-urlencoded";
???????? request.CookieContainer = cookieContainer;
???????? request.ContentLength = postData.Length; // 提交請求數據
???????? System.IO.Stream outputStream = request.GetRequestStream();
???????? outputStream.Write(postData, 0, postData.Length);
???????? outputStream.Close(); // 接收返回的頁面
???????? response = request.GetResponse() as HttpWebResponse;
???????? responseStream = response.GetResponseStream();
???????? reader = new System.IO.StreamReader(responseStream,Encoding.GetEncoding("GB2312"));
???????? srcString = reader.ReadToEnd();
???????? foreach (Cookie cookie in response.Cookies)
???????????? cookieContainer.Add(cookie); ///
???????? // 3. 打開 Default.aspx 頁面
???????? ///
???????? // 設置打開頁面的參數
???????? URI = "http://localhost:1165/WebTest/Default.aspx";
???????? request = WebRequest.Create(URI) as HttpWebRequest;
???????? request.Method = "GET";
???????? request.KeepAlive = false;
???????? request.CookieContainer = cookieContainer; // 接收返回的頁面
???????? response = request.GetResponse() as HttpWebResponse;
???????? responseStream = response.GetResponseStream();
???????? reader = new System.IO.StreamReader(responseStream, Encoding.UTF8);
???????? srcString = reader.ReadToEnd(); ///
???????? // 4. 分析返回的頁面
???????? ///
???????? //??
???? }
???? catch (WebException we)
???? {
???????? string msg = we.Message;
???? }??
之所以能夠保持 Session 和 Cookie 是因為使用了 Cookie 容器(CookieContainer),見紅色的代碼部分。 本文所有源代碼:http://files.cnblogs.com/gotolnc/AutoPostWithCookies.rar
這里涉及到3個頁面:MyLogin.aspx,LoginOK.htm,Default.aspx:
1)MyLogin.aspx 頁面
MyLogin.aspx 頁面是登錄頁面,如果用戶名和密碼正確會生成 Session 和 Cookie(LoginSession、LoginCookie),然后轉向 LoginOK.htm 頁面。
2)LoginOK.htm 頁面
LoginOK.htm 頁面是一個跳轉頁面,幾秒鐘后會自動跳轉到 Default.aspx 頁面。
3)Default.aspx 頁面
Default.aspx 頁面是主界面,打開主界面時會判斷 LoginSession 和 LoginCookie 的值是否正確,并把 Session 和 Cookie 的值顯示出來。
提交ASP.NET表單(即完成自動登錄)的代碼如下:
try
???? {
????????CookieContainer cookieContainer = new CookieContainer();
????????///
????????// 1. 打開 MyLogin.aspx 頁面,獲得 GetVeiwState & EventValidation
????????///????????????????
????????// 設置打開頁面的參數
????????string URI = "http://localhost:1165/WebTest/MyLogin.aspx";
???????? HttpWebRequest request = WebRequest.Create(URI) as HttpWebRequest;
???????? request.Method = "GET";
???????? request.KeepAlive = false;
????????// 接收返回的頁面
???????? HttpWebResponse response = request.GetResponse() as HttpWebResponse;
???????? System.IO.Stream responseStream = response.GetResponseStream();
???????? System.IO.StreamReader reader = new System.IO.StreamReader(responseStream,Encoding.UTF8);
????????string srcString = reader.ReadToEnd();
????????// 獲取頁面的 VeiwState????????????????
????????string viewStateFlag = "id=\"__VIEWSTATE\" value=\"";
????????int i = srcString.IndexOf(viewStateFlag) + viewStateFlag.Length;
????????int j = srcString.IndexOf("\"", i);
????????string viewState = srcString.Substring(i, j - i);
????????// 獲取頁面的 EventValidation????????????????
????????string eventValidationFlag = "id=\"__EVENTVALIDATION\" value=\"";
???????? i = srcString.IndexOf(eventValidationFlag) + eventValidationFlag.Length;
???????? j = srcString.IndexOf("\"", i);
????????string eventValidation = srcString.Substring(i, j - i);
///
????????// 2. 自動填充并提交 MyLogin.aspx 頁面
???????? ///
???????? // 提交按鈕的文本
???????? string submitButton = "登錄"; // 用戶名和密碼
???????? string userName = "1";
???????? string password = "1"; // 將文本轉換成 URL 編碼字符串
???????? viewState = System.Web.HttpUtility.UrlEncode(viewState);
???????? eventValidation = System.Web.HttpUtility.UrlEncode(eventValidation);
???????? submitButton = System.Web.HttpUtility.UrlEncode(submitButton); // 要提交的字符串數據。格式形如:user=uesr1&password=123
???????? string formatString =
????????????????? "userName={0}&password={1}&loginButton={2}&__VIEWSTATE={3}&__EVENTVALIDATION={4}";
???????? string postString =
????????????????? string.Format(formatString, userName, password, submitButton, viewState, eventValidation); // 將提交的字符串數據轉換成字節數組
???????? byte[] postData = Encoding.ASCII.GetBytes(postString); // 設置提交的相關參數
???????? request = WebRequest.Create(URI) as HttpWebRequest;
???????? request.Method = "POST";
???????? request.KeepAlive = false;
???????? request.ContentType = "application/x-www-form-urlencoded";
???????? request.CookieContainer = cookieContainer;
???????? request.ContentLength = postData.Length; // 提交請求數據
???????? System.IO.Stream outputStream = request.GetRequestStream();
???????? outputStream.Write(postData, 0, postData.Length);
???????? outputStream.Close(); // 接收返回的頁面
???????? response = request.GetResponse() as HttpWebResponse;
???????? responseStream = response.GetResponseStream();
???????? reader = new System.IO.StreamReader(responseStream,Encoding.GetEncoding("GB2312"));
???????? srcString = reader.ReadToEnd();
???????? foreach (Cookie cookie in response.Cookies)
???????????? cookieContainer.Add(cookie); ///
???????? // 3. 打開 Default.aspx 頁面
???????? ///
???????? // 設置打開頁面的參數
???????? URI = "http://localhost:1165/WebTest/Default.aspx";
???????? request = WebRequest.Create(URI) as HttpWebRequest;
???????? request.Method = "GET";
???????? request.KeepAlive = false;
???????? request.CookieContainer = cookieContainer; // 接收返回的頁面
???????? response = request.GetResponse() as HttpWebResponse;
???????? responseStream = response.GetResponseStream();
???????? reader = new System.IO.StreamReader(responseStream, Encoding.UTF8);
???????? srcString = reader.ReadToEnd(); ///
???????? // 4. 分析返回的頁面
???????? ///
???????? //??
???? }
???? catch (WebException we)
???? {
???????? string msg = we.Message;
???? }??
之所以能夠保持 Session 和 Cookie 是因為使用了 Cookie 容器(CookieContainer),見紅色的代碼部分。 本文所有源代碼:http://files.cnblogs.com/gotolnc/AutoPostWithCookies.rar
轉載于:https://www.cnblogs.com/kenter/archive/2009/11/10/1599612.html
總結
以上是生活随笔為你收集整理的C# 使用HttpWebRequest提交ASP.NET表单并保持Session和Cookie的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 上海欢乐谷排队攻略
- 下一篇: ASP.NET运行原理