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

时间:2022-03-05 03:08:09

这是我一年前写的一个用C#模拟以POST方法提交表单的代码,此刻记录不才面,以免忘记咯。那时候刚学C#~忽忽。。很生疏。。代码看上去也很幼稚 痴肥不堪

#region 内容添加函数(Contentinsert) 
    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控件通报参数 用于数据接收页面的提交针对差此外按钮用参数实现触发祥见: __VIEWSTATE和_EVENTVALIDATION是asp.net特有的隐藏值通报,目前认为感化在于通报数据~待查*/ 
                // 将字符串转换成字节数组 
                byte[] postData = Encoding.ASCII.GetBytes(postString); 
                // 上传数据,返回页面的字节数组 
                responseData = webClient.UploadData(uriString, "POST", postData); //本函数的核心,这里主要解决了用POST要领通报数据以模拟表单提交~还有就是制止了提交后返回到数据接收指定的页面~是个很好的要领!!详见: (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(); //向主调函数返回数据提交后转到的页面代码长度!