一个asp.net 的页面 脚本 是又jquery模拟提交的,代码如下:
 $.post("a/ba/c.aspx", { "load": 1 }, function (res) { 省略 }
 现在 我模拟 该代码向服务器请求的过程。
public string Contentinsert(string load) 
    { 
               string uriString = "www.xxx.com/a/ba/c.aspx";
                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);                 viewState = System.Web.HttpUtility.UrlEncode(viewState); 
                eventValidation = System.Web.HttpUtility.UrlEncode(eventValidation); 
            
                 // 要提交的字符串数据。格式形如:user=uesr1&password=123 
                //下面开始执行数据的提交 当提交没有错误将返回提交后的页面代码回来 
                string postString = "load=" + load+  "&__VIEWSTATE=" + viewState + "&__EVENTVALIDATION=" + eventValidation; 
         
                // 将字符串转换成字节数组 
                byte[] postData = Encoding.ASCII.GetBytes(postString); 
                // 上传数据,返回页面的字节数组 
                responseData = webClient.UploadData(uriString, "POST", postData); //本函数的核心,这里主要解决了用POST方法传递数据以模拟表单提交~还有就是避免了提交后返回到数据接收指定的页面~是个很好的方法!!
              
                //   Encoding.GetEncoding("GB2312").GetString(responseData) 
                srcString = Encoding.UTF8.GetString(responseData); 
              
                return "成功提交服务器,返回数据字节为:"+srcString.Length.ToString(); //向主调函数返回数据提交后转到的页面代码长度!                /////////////////////////////////////// 
                // 分析返回的页面 
                /////////////////////////////////////// 
                // ...... ...... 
} 运行后 代码显示还未提交到后台,返回的html如下:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml">
<head><title></title></head>
<body>
    <form name="form1" method="post" action="a/b/c.aspx" id="form1">
<div>
<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="/wEPDwULLTE2MTY2ODcyMjlkZEmRrum+6S3PapB0zLLCgoiaNgqp" />
</div>   
    </form>
    
</body>
</html>请问各位高手时怎么回事?
提交的参数"load=" + load+  "&__VIEWSTATE=" + viewState + "&__EVENTVALIDATION=" + eventValidation; 有什么不妥,请指正。ASP.NETC#模拟

解决方案 »

  1.   

    看看这个连接 是怎样处理 viewstate 的
    http://odetocode.com/articles/162.aspx用webclint 自动登陆webform 
      

  2.   

    已经看了,还是不行。是需要string postString = "{\"load\": \"1247\",\"__VIEWSTATE\":" + viewState + "}"; 昨晚json字符串 提交吗。还是缺少 按钮参数。
      

  3.   

    看文章的底部,用 HttpWebRequest , 应该可以的。看看是不是需要cookie另外,用fiddle2 检测一下正常的登陆,对比一下,就知道自己的代码提交缺什么
      

  4.   

    cookie正确,我每次提交 都返回id为__VIEWSTATE hidden隐藏域 ,都是相同的值。这是为什么。