c#以POST方式模拟提交表单

这篇博客介绍了如何使用C#的WebClient类模拟POST方式提交表单,特别是针对ASP.NET页面。首先获取VIEWSTATE和EVENTVALIDATION值,然后编码提交的数据,最后通过UploadData方法将数据发送到目标URL,实现数据的提交。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 public string Contentinsert(string bookID, string bookTitle, string bookContent,string taskUrl,string Ztagend)
    {
               string uriString = "这里是取VIEWSTATE等值的页面";

         //如果是asp.net页面,最好是先取到VIEWSTATE和EVENTVALIDATION值一并提交
                ///////////////////////////////////////
                // 打开指定的页面
                ///////////////////////////////////////
               XMLRW UpdateBook = new XMLRW();
                WebClient webClient = new WebClient();  
                byte[] responseData = webClient.DownloadData(uriString);
                string srcString = Encoding.UTF8.GetString(responseData);
                ///////////////////////////////////////
                // 填写页面并提交
                ///////////////////////////////////////
                webClient = new WebClient();
                webClient.Headers.Add("Content-Type", "application/x-www-form-urlencoded");  //定义关联的标头

                // 获取页面的 VeiwState   这个值和EventValidation 的值在这里用于数据接收页接收数据            
                string viewStateFlag = "id=/"__VIEWSTATE/" value=/"";  //动态抓取__VIEWSTATE的值
                int i = srcString.IndexOf(viewStateFlag) + viewStateFlag.Length;
                int j = srcString.IndexOf("/"",i);
                string viewState = srcString.Substring(i, j-i);

                // 获取页面的 EventValidation 这个值和EventValidation 的值在这里用于数据接收页接收数据
            string eventValidationFlag = "id=/"__EVENTVALIDATION/" value=/""; //动态抓取__EVENTVALIDATION/的值
                i = srcString.IndexOf(eventValidationFlag) + eventValidationFlag.Length;
                j = srcString.IndexOf("/"", i);
                string eventValidation = srcString.Substring(i, j - i);
            //获取页面的章数
                string viewmenuid = "<input name=/"txt_menuid/" type=/"text/" value=/"";  //动态抓取__VIEWSTATE的值
                 i = srcString.IndexOf(viewmenuid) + viewmenuid.Length;
                 j = srcString.IndexOf("/"",i);
                string txt_menuid = srcString.Substring(i, j-i);
                /* 提交按钮的文本
                string submitButton = "提交";
                 * 这句代码主要用于当数据接收页面是button的情况
                 * */
                bookTitle = System.Web.HttpUtility.UrlEncode(bookTitle);
                bookContent = System.Web.HttpUtility.UrlEncode(bookContent);
                viewState = System.Web.HttpUtility.UrlEncode(viewState);
                eventValidation = System.Web.HttpUtility.UrlEncode(eventValidation);
                txt_menuid = System.Web.HttpUtility.UrlEncode(txt_menuid);
                 // 要提交的字符串数据。格式形如:user=uesr1&password=123
                //下面开始执行数据的提交 当提交没有错误将返回提交后的页面代码回来
                string postString = "txt_title=" + bookTitle + "&txt_content=" + bookContent + "&txt_menuid=" + txt_menuid + "&cmdSaveConn.x=0&cmdSaveConn.y=0" + "&__VIEWSTATE=" + viewState + "&__EVENTVALIDATION=" + eventValidation;
          /*txt_title为标题内容,bookContent为内容txt_menuid为当前章节数cmdSaveConn.x=0&cmdSaveConn.y=0用于传递imagebutton控件传递参数 用于数据接收页面的提交针对不同的按钮用参数实现触发祥见:http://hi.baidu.com/zeratul_bb/blog/item/34d9f7fda770c241d6887deb.html __VIEWSTATE和_EVENTVALIDATION是asp.net特有的隐藏值传递,目前认为作用在于传递数据~待查*/
                // 将字符串转换成字节数组
                byte[] postData = Encoding.ASCII.GetBytes(postString);
                // 上传数据,返回页面的字节数组
                responseData = webClient.UploadData(uriString, "POST", postData); //本函数的核心,这里主要解决了用POST方法传递数据以模拟表单提交~还有就是避免了提交后返回到数据接收指定的页面~是个很好的方法!!详见:http://www.cnblogs.com/anjou/archive/2006/12/25/602943.html (asp.net中webClient填充和提交表单的方法!)
                // 将返回的将字节数组转换成字符串(HTML);
                // ASP.NET 返回的页面一般是Unicode,如果是简体中文应使用
                //   Encoding.GetEncoding("GB2312").GetString(responseData)
                srcString = Encoding.UTF8.GetString(responseData);
                UpdateBook.UpdateXml(taskUrl, bookID, Ztagend);
                return "成功添加数据,返回数据字节为:"+srcString.Length.ToString();    //向主调函数返回数据提交后转到的页面代码长度!

                ///////////////////////////////////////
                // 分析返回的页面
                ///////////////////////////////////////
                // ...... ......
  }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值