2010-08-14 105 views
2

有人请帮助 - 一直在努力解决这个糟糕的问题!烦恼! POST返回302找到的对象在HttpWebRequest中移动错误

我在做什么 - 我有一个ASPX页面,我从中发起一个GET,然后POST一个HTTPS页面,以便登录到该页面。我花了相当多的时间比较我的GET和POST构建到使用fiddler(协议分析器)的浏览器GET/POST,并且我的请求没有问题。

然而,当我尝试通过浏览器登录,一切工作正常,并登录,当我跑我的网页,我可以看到正确的GET和POST,但我得到一个302找到“对象移动错误”

本来我认为这是一个cookie问题,但经过多次实验后,我很确定这与cookie无关。我在浏览器上禁用了Cookie和JavaScript,并且尝试了,并且页面也没有任何问题。然后我模拟确切的GET/POST。

这是我的情况:

  1. 我GET和浏览器得到的是完全相同的
  2. 从站点200 OK应答是一致,除了它具有略微不同的长度3个VIEWSTATE变量相同(为什么?为什么不同,即使GET相同?)
  3. 我的POST和浏览器POST完全相同除了3 Viewstate变量(我从GET正确填充它)
  4. 然而,浏览器登录,而我得到302找到/对象移动错误。

一对夫妇的其他东西 -

一)我复制从最近的浏览器POST自检响应,并取代了我的post数据使用这个浏览器POST和这让我正确的反应!这表明
- 我的头就好了
- 我的编码设置/环境等等都很好
- 这是在ViewState值,这只能是因为浏览器首先把它交给我腥(有没有腐败我的解析GET VIEWSTATE变量,并在后期使用它,它是完美的罚款)

更新我也曾尝试Web客户端只是为了检查 - 没有任何区别,同样的302 更新的对象主要移动指向一个错误页面,说'发生了严重的错误等等' - POST在服务器上导致错误,a nd良好的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)

,并为那些谁照顾,我的帖子标题施工规范

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); 

..然后阅读流等没有饼干。

+1

你确定浏览器什么时候成功登录,它没有得到302响应吗?它只会自动关注重定向。当你得到302时,响应中的Location标题(它试图向你发送信息的地方是什么?) – superfell 2010-08-14 18:27:56

+0

对于浏览器:在fiddler中,我看不到302响应 - 只是POST的直接HTTP/1.1 200 OK响应,但当我做POST时,我得到302。我会假设我会在消息级看到任何自动跟随在提琴手中,但我什么都看不到。它是GET,然后POST - 成功200 OK。它必须是一些微不足道的东西,只是无法弄清楚 - 为什么对我的完全相同的GET的反应与浏览器接收到的有些不同?我认为这是问题所在...... – Gerry 2010-08-14 19:04:34

+0

是否应该有自动重定向?你是在做一个Response.Redirect,或者是一个Server.Transfer的地方? – Doobi 2010-08-14 22:09:53

回答

4

我终于明白了 - 希望别人有机会解决同样的问题,不必再次通过这个。大多数HTTP专家和熟悉WWW开发的人都可能无法实现,但是新手很可能。

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

所以,作为一个学习等新人

  • 如果你想通过代码发布到一个页面,将它发送您从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的等程序,我开始通过消除饼干,JavaScript的缩小我的问题,使用招(伟大的分析工具GET施工,施工后一个接一个,免费),然后最后使用BeyondCompare进行字节比较,那就是当我捕获VIEWSTATE变量修改。

我在URL编码方面学到了一课,希望你不必!