谁知道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();
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();
这两个东西是server端返回给你的吗?
在包头中还是在包体中?
或者你的POSTData中有问题,服务器验证格式发现不对.没有测试用例,只能推测.
我常用的方法是这样的:自己写了个字段提取函数(其实还有其他字段,只不过不常用。如有需求,自己再加进去就可以了。)
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}"这样一来,全部的系统字段处理都变成自动的了。非常方便。