【发布时间】:2011-03-29 21:54:14
【问题描述】:
请有人帮忙 - 一直在努力解决这个糟糕的问题!
我在做什么 - 我有一个 ASPX 页面,我从该页面发起一个 GET,然后向一个 HTTPS 页面发送一个 POST,以便登录它。我花了很多时间将我的 GET 和 POST 构造与使用 fiddler(协议分析器)的浏览器 GET/POST 进行比较,我的请求很好。
但是,当我尝试通过浏览器登录时,一切正常并登录。当我运行我的页面时,我可以看到正确的 GET 和 POST,但我得到一个 302 发现“对象移动错误”
最初我认为这是一个 cookie 问题,但经过大量实验后,我很确定这与 cookie 无关。我在浏览器上禁用了 cookie 和 javascript 并进行了尝试,没有任何一个页面都可以正常工作。然后我模拟了确切的 GET/POST。
这是我的情况:
- 我的 GET 和浏览器的 GET 完全一样
- 来自站点的 200 OK 响应完全相同,除了三个 VIEWSTATE 变量的长度略有不同(为什么?为什么即使 GET 相同也不同?)
- 我的 POST 和浏览器 POST 完全相同,除了 3 个 Viewstate 变量(我从 GET 中正确填写)
- 然而,浏览器登录时,我收到 302 found / object removed 错误。
其他几件事 -
a) 我从最近的浏览器 POST 中复制了 POST 响应,并用这个浏览器 POST 替换了我的 POST 参数,这让我得到了正确的响应!这表明
- 我的标题很好
- 我的编码设置/环境等都很好
- VIEWSTATE 值中有问题,这可能只是因为浏览器首先将其发送给我(我在解析 GET VIEWSTATE 变量并在 POST 中使用它时没有损坏,这很好)
更新我也试过 WebClient 只是为了检查 - 没有区别,同样的 302。 update 移动的对象基本上指向一个错误页面,上面写着“发生了严重错误等等” - 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。
【问题讨论】:
-
您确定浏览器在成功登录时也没有收到 302 响应吗?它只会自动跟随重定向。当您收到 302 时,响应中的 Location 标头是什么(它试图向您发送什么?)
-
对于浏览器:在提琴手中我看不到 302 响应 - 只是对 POST 的直接 HTTP/1.1 200 OK 响应,但是当我执行 POST 时得到 302。我会假设我会在消息级别看到提琴手中的任何自动关注,但我什么也没看到。它是 GET,然后是 POST - 成功 200 OK。这一定是一件微不足道的事情,只是无法弄清楚是什么——为什么对我完全相同的 GET 的响应与浏览器接收到的有点不同?我认为这就是问题所在......
-
应该有自动重定向吗?你是在做 Response.Redirect,还是 Server.Transfer?
标签: c# asp.net https httpwebrequest