2010-08-14 107 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編碼方面學到了一課,希望你不必!