烦恼! POST在HttpWebRequest中返回302找到的对象移动错误

时间:2010-08-14 18:17:14

标签: c# asp.net https httpwebrequest

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

我正在做什么 - 我有一个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找到/对象移动错误。
  5. 其他一些事情 -

    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。

1 个答案:

答案 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编码的一课,希望你不必这样做!