谁知道aspx页面模拟需要怎么样弄?模拟jsp、php之类的都很容易,但是这次模拟aspx的问题就来了,用httplook跟踪多出了DN.RT.CurrentUserId=DN.Admin;与.ASPXAUTH=49DB55…………,问题是这两个东西从程序中怎么获取出来?请高手解答! 程序源码 
CookieContainer cc = new CookieContainer(); 
        string postData = "__VIEWSTATE=dDwyNjA2Mzk5MzY7dDw7bDxpPDA%2BOz47bDx0PDtsPGk8MT47aTwzPjtpPDU%2BO2k8Nz47aTwxMz47aTwxNT47PjtsPHQ8cDxwPGw8VGV4dDs%2BO2w855So5oi35ZCNOz4%2BOz47Oz47dDxwPHA8bDxSZWFkT25seTs%2BO2w8bzxmPjs%2BPjs%2BOzs%2BO3Q8cDxwPGw8VGV4dDs%2BO2w85a%2BG56CBOz4%2BOz47Oz47dDxwPHA8bDxSZWFkT25seTs%2BO2w8bzxmPjs%2BPjs%2BOzs%2BO3Q8cDxwPGw8VGV4dDs%2BO2w85LiK5rW35LiH55Sz5L%2Bh5oGv5Lqn5Lia6IKh5Lu95pyJ6ZmQ5YWs5Y%2B4Oz4%2BOz47Oz47dDxwPHA8bDxUZXh0Oz47bDwwMjEtNjMyMzEwNzXmiJYwMjEtNjM1MTIxMTnovaw2MzA5LDYzMTA7Pj47Pjs7Pjs%2BPjs%2BPjs%2Bmin4IKkE4KjmjpTrMJdXwqOCt1M%3D" + 
            "&TextBox1=" + LoginName + "&Textbox2=" + Password + "&Button1="; 
        byte[] byteArray = Encoding.UTF8.GetBytes(postData);         HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create(new Uri(MyServer + "/Users_Login.aspx")); 
        webRequest.AllowAutoRedirect = true; 
        webRequest.ServicePoint.Expect100Continue = false; 
        webRequest.CookieContainer = cc; 
        webRequest.KeepAlive = true; 
        webRequest.Method = "POST"; 
        webRequest.ContentType = "application/x-www-form-urlencoded"; 
        webRequest.ContentLength = byteArray.Length; 
        Stream newStream = webRequest.GetRequestStream(); 
        // Send the data. 
        newStream.Write(byteArray, 0, byteArray.Length);//写入参数 
        newStream.Close();         HttpWebResponse response = (HttpWebResponse)webRequest.GetResponse(); 
        StreamReader Sr = new StreamReader(response.GetResponseStream(), Encoding.UTF8); 
        string CookieContainer; 
        string GetHtml = Sr.ReadToEnd(); 
        Sr.Close(); 
        CookieContainer = ""; 
foreach (Cookie i in webRequest.CookieContainer.GetCookies(new Uri(MyServer + "/Users_Login.aspx"))) 
            { 
                CookieContainer += i.ToString() + ";"; 
            } 
            if (CookieContainer.Length > 0) 
                CookieContainer = CookieContainer.Substring(0, CookieContainer.Length - 1); 
response.Close(); 

解决方案 »

  1.   

    要通过嗅探工具,分析HTTP传输数据吧~
      

  2.   

    用httplook跟踪多出了DN.RT.CurrentUserId=DN.Admin;与.ASPXAUTH=49DB55…………,问题是这两个东西从程序中怎么获取出来?
    这两个东西是server端返回给你的吗?
    在包头中还是在包体中?
      

  3.   

    传输的数据都进去了,就是返回的时候多出DN.RT.CurrentUserId和.ASPXAUTH在程序里面取不出来,经过多次分析如果登录失败是不会产生这两个东西的,陈宫才有,但是登录的时候参数并没有错误或者缺少。
      

  4.   

    我觉得应该是当你打开登陆页面的时候,server端就给你什么隐藏的信息了,你模拟登陆的时候必须把这个信息如何处理后放在包头或包体的某个地方一并提交,server收到后验证是不是正确的,如不正确会返回错误代码(可能就是你收到的串).所以还应该抓一下打开登陆窗口时和server所有的交互信息.
    或者你的POSTData中有问题,服务器验证格式发现不对.没有测试用例,只能推测.
      

  5.   

    wdgphc你说的因素我都检查过了,GET的时候没有多余的参数,而POSTData如果我把格式改了会报HTTP500错误,所以提交的格式并没有错,而且就算把HTTPLOOK跟踪到的一抹一样的POST过去都是错误的,就是获取不到DN.RT.CurrentUserId跟.ASPXAUTH
      

  6.   

    主要是有很多的系统使用的以“__”开头的字段。这些字段记得全部Post回去就可以了。
    我常用的方法是这样的:自己写了个字段提取函数(其实还有其他字段,只不过不常用。如有需求,自己再加进去就可以了。)
            static void GetField(string Data, out string __EVENTTARGET, out string __EVENTARGUMENT, out string __LASTFOCUS, out string __VIEWSTATE, out string __PREVIOUSPAGE, out string __EVENTVALIDATION)
            {
                __EVENTTARGET = null;
                __EVENTARGUMENT = null;
                __LASTFOCUS = null;
                __VIEWSTATE = null;
                __PREVIOUSPAGE = null;
                __EVENTVALIDATION = null;
                Regex rg = new Regex(@"<input type=""hidden"" name=""__.*/>");
                MatchCollection mc = rg.Matches(Data);
                foreach(Match item in mc)
                {
                    XmlDocument xdoc = new XmlDocument();
                    xdoc.InnerXml = item.Value;
                    string name = xdoc.FirstChild.Attributes["name"].Value;
                    string value = xdoc.FirstChild.Attributes["value"].Value;
                    switch(name)
                    {
                        case "__EVENTTARGET":
                            __EVENTTARGET = value;
                            break;
                        case "__EVENTARGUMENT":
                            __EVENTARGUMENT = value;
                            break;
                        case "__VIEWSTATE":
                            __VIEWSTATE = value;
                            break;
                        case "__PREVIOUSPAGE":
                            __PREVIOUSPAGE = value;
                            break;
                        case "__EVENTVALIDATION":
                            __EVENTVALIDATION = value;
                            break;
                    }
                }
                __EVENTTARGET = System.Web.HttpUtility.UrlEncode(__EVENTTARGET);
                __EVENTARGUMENT = System.Web.HttpUtility.UrlEncode(__EVENTARGUMENT);
                __LASTFOCUS = System.Web.HttpUtility.UrlEncode(__LASTFOCUS);
                __VIEWSTATE = System.Web.HttpUtility.UrlEncode(__VIEWSTATE);
                __PREVIOUSPAGE = System.Web.HttpUtility.UrlEncode(__PREVIOUSPAGE);
                __EVENTVALIDATION = System.Web.HttpUtility.UrlEncode(__EVENTVALIDATION);
            }把字段提取出来后,在Post之前,再把字段加到Post里:
                req.Content = string.Format(Properties.Resources.PostFrame, "menu", 0, __VIEWSTATE, __LASTFOCUS, "", __PREVIOUSPAGE, __EVENTVALIDATION);其中Properties.Resources.PostFrame="__EVENTTARGET={0}&__EVENTARGUMENT={1}&__LASTFOCUS={2}&__VIEWSTATE={3}&{4}__PREVIOUSPAGE{5}&__EVENTVALIDATION={6}"这样一来,全部的系统字段处理都变成自动的了。非常方便。