asp.net 程序自动提交登陆表单并保持Session及Cookie

简介:

代码要点:

1、通过附加一个cookiecontainer到httprequest对象中,可以得到登录后返回的代表SESSION ID的COOKIE。

2、将此COOKIE包含在一个cookiecontainer中并附加到另一个HTTPREQUEST请求中,则可以实现SESSION的还原。

部分主要代码:

        CookieContainer cookieContainer = new CookieContainer();

        ///////////////////////////////////////////////////
        // 1. 打开 Login.aspx 页面,获得 VeiwState & EventValidation。
       //
如果是登陆页为asp.net页面,需要获取VeiwState及EventValidation 
        ///////////////////////////////////////////////////                
        // 设置打开页面的参数
        string URI = http://localhost/Test/Login.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. 自动填充并提交 Login.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();

        ///////////////////////////////////////////////////
        // 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. 分析返回的页面
        ///////////////////////////////////////////////////
        //  




本文转自94cool博客园博客,原文链接:http://www.cnblogs.com/94cool/articles/1532596.html,如需转载请自行联系原作者

相关文章
|
算法 Java 测试技术
Benchmark.NET:让 C# 测试程序性能变得既酷又简单
Benchmark.NET是一款专为 .NET 平台设计的性能基准测试框架,它可以帮助你测量代码的执行时间、内存使用情况等性能指标。它就像是你代码的 "健身教练",帮助你找到瓶颈,优化性能,让你的应用跑得更快、更稳!希望这个小教程能让你在追求高性能的路上越走越远,享受编程带来的无限乐趣!
1058 13
|
Ubuntu 持续交付 API
如何使用 dotnet pack 打包 .NET 跨平台程序集?
`dotnet pack` 是 .NET Core 的 NuGet 包打包工具,用于将代码打包成 NuGet 包。通过命令 `dotnet pack` 可生成 `.nupkg` 文件。使用 `--include-symbols` 和 `--include-source` 选项可分别创建包含调试符号和源文件的包。默认情况下,`dotnet pack` 会先构建项目,可通过 `--no-build` 跳过构建。此外,还可以使用 `--output` 指定输出目录、`-c` 设置配置等。示例展示了创建类库项目并打包的过程。更多详情及命令选项,请参考官方文档。
1104 12
|
存储 运维
.NET开发必备技巧:使用Visual Studio分析.NET Dump,快速查找程序内存泄漏问题!
.NET开发必备技巧:使用Visual Studio分析.NET Dump,快速查找程序内存泄漏问题!
504 2
|
自然语言处理 C# 图形学
使用dnSpyEx对.NET Core程序集进行反编译、编辑和调试
使用dnSpyEx对.NET Core程序集进行反编译、编辑和调试
504 0
|
XML 存储 安全
C#开发的程序如何良好的防止反编译被破解?ConfuserEx .NET混淆工具使用介绍
C#开发的程序如何良好的防止反编译被破解?ConfuserEx .NET混淆工具使用介绍
2159 0
|
Linux C# iOS开发
如何用 WinDbg 调试Linux上的 .NET程序
【7月更文挑战第13天】 1. `dotnet-dump`: Collects process dumps with `dotnet-dump collect -p <process_id>`. 2. `lldb`: Debugs Mono runtime apps on macOS/Linux. 3. **Visual Studio Code**: Remotely debugs .NET via the C# extension. 4. **JetBrains Rider**: Supports remote debugging of .NET on Linux.
487 2
|
开发框架 NoSQL .NET
使用 Asp.net core webapi 集成配置系统,提高程序的灵活和可维护性
使用 Asp.net core webapi 集成配置系统,提高程序的灵活和可维护性
327 0
|
Web App开发 数据采集 开发框架
在.NET程序中整合微软的Playwright,使用 Playwright 的最佳实践和技巧
在.NET程序中整合微软的Playwright,使用 Playwright 的最佳实践和技巧
|
存储 安全 C#
技术心得记录:强命名的延迟与关联在.net程序集保护中的作用及其逆向方法
技术心得记录:强命名的延迟与关联在.net程序集保护中的作用及其逆向方法
|
开发框架 前端开发 JavaScript
程序与技术分享:ASP.NET发展史(【译】)
程序与技术分享:ASP.NET发展史(【译】)
418 0