有人请帮忙 - 一直在努力解决这个糟糕的问题!
我正在做什么 - 我有一个ASPX页面,我从该页面发起GET,然后发送到 HTTPS 页面的POST,以便登录它。我花了很多时间将我的GET和POST结构与使用fiddler(协议分析器)的浏览器GET / POST进行比较,我的请求很好。
然而,当我尝试通过浏览器登录时,一切正常并且它会登录。当我运行我的页面时,我可以看到正确的GET和POST,但是我找到了302找到的'对象移动错误'
最初我认为这是一个cookie问题,但经过多次实验后我很确定这与cookie无关。我已经在浏览器上禁用了cookie和javascript并尝试了,并且页面工作正常,没有。然后我模拟了确切的GET / POST。
这是我的情况:
其他一些事情 -
a)我从最近的浏览器POST中复制了POST响应,并用这个浏览器POST替换了我的POST参数,这让我得到了正确的响应!这表明了 - 我的标题很好 - 我的编码设置/环境等都很好 - 在VIEWSTATE值中有些可疑,这只能是因为浏览器首先将它发送给我(在解析GET VIEWSTATE变量并在POST中使用它时没有损坏,这很好)
更新我也尝试过WebClient来检查 - 没有区别,相同的302。 更新移动的对象基本上指向一个错误页面,其中显示“发生严重错误等等” - POST导致服务器出错,以及良好POST(浏览器)之间的唯一区别)和我的POST是Viewstate变量。
那么 - 我做错了什么?为什么这个残酷的世界折磨着我?!!
(PS - 浏览器序列的另一个不同之处,不确定它的重要性)
Browser:
CONNECT
GET
GET (for a favicon, which returns an error)
CONNECT
POST (success)
Me:
CONNECT
GET
POST (flaming failure, 302 - page moved)
对于那些关心的人,我的POST标题构造代码
HttpWebRequest myRequest = (HttpWebRequest)WebRequest.Create(URL);
myRequest.UserAgent = chromeUserAgent;
//myRequest.CookieContainer = cCookies;
myRequest.ContentType = "application/x-www-form-urlencoded";
myRequest.Accept = chromeAccept;
myRequest.Referer = url;
myRequest.AllowAutoRedirect = false;
myRequest.Host = "thesitethatskillingme.com";
myRequest.Headers.Add("Origin", "https://thesitethatskillingme.com");
myRequest.Headers.Add("Accept-Encoding", chromeAcceptEncoding);
myRequest.Headers.Add("Accept-Language", chromeAcceptLanguage);
myRequest.Headers.Add("Accept-Charset", chromeAcceptCharset);
myRequest.Headers.Add("Cache-Control", "max-age=0");
myRequest.ServicePoint.Expect100Continue = false;
myRequest.Method = "POST";
myRequest.KeepAlive = true;
ASCIIEncoding ascii = new ASCIIEncoding();
byte[] bData = ascii.GetBytes(data);
myRequest.ContentLength = bData.Length;
using (Stream oStream = myRequest.GetRequestStream())
oStream.Write(bData, 0, bData.Length);
...然后读取流等没有cookie。
答案 0 :(得分:4)
我终于弄明白了 - 希望能够遇到同样问题的其他人不必再次经历这个问题。大多数HTTP大师和熟悉WWW开发的人都可能永远不会打它,但新手很可能。
那是什么问题?我把这个问题缩小到了我一直怀疑的VIEWSTATE(见上面的帖子......)。事实证明,我所要做的就是将Server.UrlEncode解析后的VIEWSTATE值,然后再将它们放到POST上 - 就是这样。我花了一整天的时间来做到这一点。
所以,作为对其他新人的学习
如果您尝试通过代码POST到页面并需要发送它从GET解析的VIEWSTATE变量,那么首先在创建参数之前对Server.UrlEncode进行编码 - 例如
- do GET
- get the response stream into a string
- parse the string (I use HtmlAgilityPack- fabulous)
- param1 = name +"="+Server.UrlEncode(value)+"&"
- POST param = param1+param2+...
-send this in POST - voila, it works
因为我从来没有使用过HttpWebRequest等编程,我开始通过使用fiddler(伟大的分析工具,免费)逐个消除cookie,javascript,GET构造,POST构造来缩小我的问题,然后最后使用BeyondCompare进行字节比较,就在我捕获VIEWSTATE变量时。
我学到了关于URL编码的一课,希望你不必这样做!