【问题标题】:vexed! POST returns a 302 found object moved error in HttpWebRequest烦恼! POST 在 HttpWebRequest 中返回 302 found object move 错误
【发布时间】:2011-03-29 21:54:14
【问题描述】:

请有人帮忙 - 一直在努力解决这个糟糕的问题!

我在做什么 - 我有一个 ASPX 页面,我从该页面发起一个 GET,然后向一个 HTTPS 页面发送一个 POST,以便登录它。我花了很多时间将我的 GET 和 POST 构造与使用 fiddler(协议分析器)的浏览器 GET/POST 进行比较,我的请求很好。

但是,当我尝试通过浏览器登录时,一切正常并登录。当我运行我的页面时,我可以看到正确的 GET 和 POST,但我得到一个 302 发现“对象移动错误”

最初我认为这是一个 cookie 问题,但经过大量实验后,我很确定这与 cookie 无关。我在浏览器上禁用了 cookie 和 javascript 并进行了尝试,没有任何一个页面都可以正常工作。然后我模拟了确切的 GET/POST。

这是我的情况:

  1. 我的 GET 和浏览器的 GET 完全一样
  2. 来自站点的 200 OK 响应完全相同,除了三个 VIEWSTATE 变量的长度略有不同(为什么?为什么即使 GET 相同也不同?)
  3. 我的 POST 和浏览器 POST 完全相同,除了 3 个 Viewstate 变量(我从 GET 中正确填写)
  4. 然而,浏览器登录时,我收到 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


【解决方案1】:

我终于弄明白了——希望遇到同样问题的其他人不必再次经历这个问题。可能大多数 HTTP 专家和熟悉 WWW 开发的人都不会碰它,但新手完全可以。

那么问题出在哪里?我已将问题缩小到我一直怀疑的 VIEWSTATE(请参阅我上面的帖子......)。事实证明,我所要做的就是在将解析后的 VIEWSTATE 值放入 POST 之前对它们进行 Server.UrlEncode - 就是这样。我花了一整天的时间才做到这一点。

所以,作为对其他新人的学习

  • 如果您尝试通过代码 POST 到页面并且需要将您从 GET 解析的 VIEWSTATE 变量发送给它,那么在创建参数之前首先对其进行 Server.UrlEncode - 例如

  • 做 GET
  • 将响应流转化为字符串
  • 解析字符串(我使用HtmlAgilityPack-fabulous)
  • param1 = name +"="+Server.UrlEncode(value)+"&"
  • POST 参数 = 参数 1+参数 2+... - 在 POST 中发送 - 瞧,它有效

因为我从未使用过 HttpWebRequest 等进行编程,所以我首先通过使用 fiddler(出色的分析工具,免费)一一消除 cookie、javascript、GET 构造、POST 构造来缩小我的问题范围,然后最后使用 BeyondCompare 进行字节比较,这时我发现了 VIEWSTATE 变量的修改。

我学到了有关 URL 编码的课程,希望您不必这样做!

【讨论】:

    猜你喜欢
    • 2013-12-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-18
    • 2018-09-25
    • 2015-04-14
    • 2017-09-13
    • 2021-03-31
    相关资源
    最近更新 更多