gpt4 book ai didi

c# - 烦恼! POST 在 HttpWebRequest 中返回 302 found object moved 错误

转载 作者:行者123 更新时间:2023-11-30 21:20:03 30 4
gpt4 key购买 nike

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

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

但是,当我尝试通过浏览器登录时,一切正常并登录。当我运行我的页面时,我可以看到正确的 GET 和 POST,但我收到 302 found 'object moved error'

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

这是我的情况:

  1. 我的 GET 和浏览器的 GET 完全一样
  2. 来自站点的 200 OK 响应完全相同,除了三个 VIEWSTATE 变量的长度略有不同(为什么?为什么不同,即使 GET 相同?)
  3. 我的 POST 和浏览器 POST 完全相同,除了 3 个 Viewstate 变量(我从 GET 中正确填写)
  4. 然而,浏览器登录时,我收到 302 found/object moved 错误。

一些其他的事情 -

a) 我从最近的浏览器 POST 复制了 POST 响应,并用这个浏览器 POST 替换了我的 POST 参数,这让我得到了正确的响应!这表明
- 我的标题很好
- 我的编码设置/环境等都很好
- VIEWSTATE 值中有些可疑,这只能是因为浏览器首先将它发送给我(在我解析 GET VIEWSTATE 变量并在 POST 中使用它时没有损坏,它完全没问题)

更新 我也试过 WebClient 只是为了检查 - 没有区别,相同的 302。更新 移动的对象基本上指向一个错误页面,上面写着“发生严重错误等等” - POST 在服务器上导致错误,而良好的 POST(浏览器的)之间的唯一区别) 和我的 POST 是 Viewstate 变量。

那么 - 我做错了什么?为什么这个残酷的世界要折磨我?!!

(PS - 浏览器序列中的另一个差异,不确定它有多重要)


Browser:<br/>
CONNECT<br/>
GET<br/>
GET (for a favicon, which returns an error)<br/>
CONNECT<br/>
POST (success)<br/>
Me:<br/>
CONNECT<br/>
GET<br/>
POST (flaming failure, 302 - page moved)<br/>

对于那些关心的人,我的 POST header 构造代码

    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。

最佳答案

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

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

SO,作为对其他新人的学习

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


  • <li>do GET</li>
    <li>get the response stream into a string</li>
    <li>parse the string (I use HtmlAgilityPack- fabulous)</li>
    <li>param1 = name +"="+Server.UrlEncode(value)+"&"</li>
    <li>POST param = param1+param2+...
    -send this in POST - voila, it works</li>


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

我学到了有关 URL 编码的类(class),希望您不必学习!

关于c# - 烦恼! POST 在 HttpWebRequest 中返回 302 found object moved 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3484558/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com