由于种种原因,我们有时需要从互联网上抓取一些资料,有些页面可以直接打开,而有些页面必登录之后才能打开。本文介绍的是使用 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

转载于:https://www.cnblogs.com/gotolnc/archive/2009/07/31/1536226.html

[保存]C# 使用HttpWebRequest提交ASP.NET表单并保持Session和Cookie相关推荐

  1. C# 使用HttpWebRequest提交ASP.NET表单并保持Session和Cookie

    由于种种原因,我们有时需要从互联网上抓取一些资料,有些页面可以直接打开,而有些页面必登录之后才能打开.本文介绍的是使用 HttpWebRequest 和 HttpWebResponse 自动填写提交 ...

  2. 使用HttpWebRequest提交ASP.NET表单并保持Session和Cookie

    using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...

  3. ajax提交,form表单提交,onsubmit=return checksubmit()提交验证

    Ajax提交的两种方式: 一是url参数提交数据, 二是form提交(和平常一样在后台可以获取到Form表单的值).在所要提交的表单中,如果元素很多的话建议用第二种方式进行提交 一.Url参数提交数据 ...

  4. php 返回页面重复提交,php防止表单重复提交

    后端防止重复提交的基本原理: 服务器返回表单页面时,会先生成一个subToken保存于session,并把该subToen传给表单页面.当表单提交时会带上subToken,服务器获取表单信息判断ses ...

  5. java表单重复提交_JavaWeb防止表单重复提交(转载)

    转载自:http://blog.csdn.net/ye1992/article/details/42873219 在平时开发中,如果网速比较慢的情况下,用户提交表单后,发现服务器半天都没有响应,那么用 ...

  6. Form 表单提交 和 Ajax 表单提交 的一些区别

    自己一些心得体会: 1:form 表单提交后进行后台处理程序,没有直接返回值,只能进行后台处理,Form标签里的所有数据全部提交到后台 ajax 表单提交,是可以局部提交,具有ajax的所有属性... ...

  7. python表单防重复提交_防止表单重复提交的几种策略

    表单重复提交是在多用户Web应用中最常见.带来很多麻烦的一个问题.有很多的应用场景都会遇到重复提交问题,比如: 点击提交按钮两次. 点击刷新按钮. 使用浏览器后退按钮重复之前的操作,导致重复提交表单. ...

  8. php提交后清楚表单缓存,PHP提交表单后如何控制缓存 | 学步园

    在开发过程中,经常会出现表单出错而返回页面的时候填写的信息全部丢失的情况,为了支持页面回跳,可以通过以下两种方法实现. 1.使用header头设置缓存控制头Cache-control. PHP代码 h ...

  9. oracle无法减小列长度,中国港湾扩展表单分配时调整字段后保存时报错,无法正常维护表单定义...

    版本号: 7.0.4 业务场景(如下):中国港湾扩展表单分配时调整字段后保存时报错,无法正常维护表单定义 异常提示: 异常信息:添加业务实体的时候出错. 导致错误的应用程序或对象的名称:Generso ...

最新文章

  1. hibernate主配置文件中指定session与当前线程绑定
  2. 13.MATLAB的while、for、break、continue循环操作
  3. Acwing第 9 场周赛【未完结】
  4. .Net开发人员应该下载的十种必备工具(二)
  5. java操作redis的操作_Java操作redis简单示例
  6. java 优化线程_Java | 多线程调优(下):如何优化多线程上下文切换?
  7. java 对象赋值给scala_将Scala变量转换为Java对象… varargs
  8. 关于opencv的cv2.WINDOW_一类
  9. Android ActivityManager类
  10. 【Matlab】函数uigetfile的使用
  11. 毕业论文/分页符/段前2行没用
  12. CentOS — 文本编辑器
  13. vscode 脑图插件mindmap
  14. VisionPro使用C#编写脚本
  15. 2022-10-25 系统app提示Signature mismatch for shared user: SharedUserSetting,开机后无法安装
  16. ISP 图像信号处理器数字IP实现
  17. LeetCode 5. Longest Palindromic Substring 最长回文子串 Python 四种解法(Manacher 动态规划)
  18. 【解答】多台西门子PLC之间可不可以无线通讯
  19. 股份制银行的薪资对比
  20. 第十二篇:从生稣出熟稣,从熟稣出醍醐-再读内核驱动设计目标

热门文章

  1. 中国公司又称雄国际AI大赛,IARPA人脸识别挑战赛依图夺冠
  2. Ubuntus安装vmware tools工具
  3. 打造SpringBootTemplate(SpringBoot项目的模版)
  4. POJ 3111 K Best 贪心 二分
  5. 你从 Kotlin 中 get 了多少技能了?
  6. “隐私经济”有未来吗?
  7. Elasticsearch 嵌套类型nested
  8. uva-10341-二分法
  9. Mysql中的外键分析(什么是外键,为什么要用外键,添加外键,主外键关联删除)
  10. MVC利用Routing实现多域名绑定一个站点、二级域名以及二级域名注册Area