浩晨众云网站建设,新征程启航
为企业提供网站建设、域名注册、服务器等服务
使用HttpWebRequest提交ASP.NET表单并保持Session和Cookie

10年积累的成都网站建设、成都网站设计经验,可以快速应对客户对网站的新想法和需求。提供各种问题对应的解决方案。让选择我们的客户得到更好、更有力的网络服务。我虽然不认识你,你也不认识我。但先网站设计后付款的网站建设流程,更有沙坡头免费网站建设让你可以放心的选择与我们合作。
由于种种原因,我们有时需要从互联网上抓取一些资料,有些页面可以直接打开,而有些页面必登录之后才能打开。本文介绍的是使用 HttpWebRequest 和 HttpWebResponse 自动填写提交 ASP.NET表单并保持Session和Cookie 的一个完整的例子。本文所有源代码:AutoPostWithCookies.rar
这里涉及到3个页面:MyLogin.aspx,LoginOK.htm,Default.aspx:
1)MyLogin.aspx 页面
2)LoginOK.htm 页面
3)Default.aspx 页面
提交ASP.NET表单(即完成自动登录)的代码如下:
- try
 - {
 - CookieContainercookieContainer=newCookieContainer();
 - ///////////////////////////////////////////////////
 - //1.打开MyLogin.aspx页面,获得VeiwState&EventValidation
 - ///////////////////////////////////////////////////
 - //设置打开页面的参数
 - stringURI="http://localhost:1165/WebTest/MyLogin.aspx";
 - HttpWebRequestrequest=WebRequest.Create(URI)asHttpWebRequest;
 - request.Method="GET";
 - request.KeepAlive=false;
 - //接收返回的页面
 - HttpWebResponseresponse=request.GetResponse()asHttpWebResponse;
 - System.IO.StreamresponseStream=response.GetResponseStream();
 - System.IO.StreamReaderreader=newSystem.IO.StreamReader(responseStream,Encoding.UTF8);
 - stringsrcString=reader.ReadToEnd();
 - //获取页面的VeiwState
 - stringviewStateFlag="id=\"__VIEWSTATE\"value=\"";
 - inti=srcString.IndexOf(viewStateFlag)+viewStateFlag.Length;
 - intj=srcString.IndexOf("\"",i);
 - stringviewState=srcString.Substring(i,j-i);
 - //获取页面的EventValidation
 - stringeventValidationFlag="id=\"__EVENTVALIDATION\"value=\"";
 - i=srcString.IndexOf(eventValidationFlag)+eventValidationFlag.Length;
 - j=srcString.IndexOf("\"",i);
 - stringeventValidation=srcString.Substring(i,j-i);
 - ///////////////////////////////////////////////////
 - //2.自动填充并提交MyLogin.aspx页面
 - ///////////////////////////////////////////////////
 - //提交按钮的文本
 - stringsubmitButton="登录";
 - //用户名和密码
 - stringuserName="1";
 - stringpassword="1";
 - //将文本转换成URL编码字符串
 - viewState=System.Web.HttpUtility.UrlEncode(viewState);
 - eventValidation=System.Web.HttpUtility.UrlEncode(eventValidation);
 - submitButton=System.Web.HttpUtility.UrlEncode(submitButton);
 - //要提交的字符串数据。格式形如:user=uesr1&password=123
 - stringformatString=
 - "userName={0}&password={1}&loginButton={2}&__VIEWSTATE={3}&__EVENTVALIDATION={4}";
 - stringstringpostString=
 - string.Format(formatString,userName,password,submitButton,viewState,eventValidation);
 - //将提交的字符串数据转换成字节数组
 - byte[]postData=Encoding.ASCII.GetBytes(postString);
 - //设置提交的相关参数
 - request=WebRequest.Create(URI)asHttpWebRequest;
 - request.Method="POST";
 - request.KeepAlive=false;
 - request.ContentType="application/x-www-form-urlencoded";
 - request.CookieContainer=cookieContainer;
 - request.ContentLength=postData.Length;
 - //提交请求数据
 - System.IO.StreamoutputStream=request.GetRequestStream();
 - outputStream.Write(postData,0,postData.Length);
 - outputStream.Close();
 - //接收返回的页面
 - response=request.GetResponse()asHttpWebResponse;
 - responseresponseStream=response.GetResponseStream();
 - reader=newSystem.IO.StreamReader(responseStream,Encoding.GetEncoding("GB2312"));
 - srcString=reader.ReadToEnd();
 - ///////////////////////////////////////////////////
 - //3.打开Default.aspx页面
 - ///////////////////////////////////////////////////
 - //设置打开页面的参数
 - URI="http://localhost:1165/WebTest/Default.aspx";
 - request=WebRequest.Create(URI)asHttpWebRequest;
 - request.Method="GET";
 - request.KeepAlive=false;
 - request.CookieContainer=cookieContainer;
 - //接收返回的页面
 - response=request.GetResponse()asHttpWebResponse;
 - responseresponseStream=response.GetResponseStream();
 - reader=newSystem.IO.StreamReader(responseStream,Encoding.UTF8);
 - srcString=reader.ReadToEnd();
 - ///////////////////////////////////////////////////
 - //4.分析返回的页面
 - ///////////////////////////////////////////////////
 - //
 - }
 - catch(WebExceptionwe)
 - {
 - stringmsg=we.Message;
 - }
 
说明:
1) 之所以能够保持 Session 和 Cookie 是因为使用了 Cookie 容器(CookieContainer),见红色的代码部分。
2) POST ASP.NET页面时,需要把 VeiwState 和 EventValidation 数据也一同 POST 过去。以上介绍ASP.NET表单并保持Session和Cookie
【编辑推荐】