2010-09-07 48 views
0

我正在嘗試閱讀包含非延遲重定向的頁面的HTML。下面的代碼片段(C#)會給我的目的地/重定向頁面,而不是最初的一個我需要看到:如何在重定向之前捕獲重定向頁面的HTML?

using System.Net; 
using System.Text; 

public class SomeClass { 
    public static void Main() { 
     byte[] data = new WebClient().DownloadData("http://SomeUrl.com"); 
     System.Console.WriteLine(Encoding.ASCII.GetString(data)); 
    } 
} 

有沒有辦法得到一個重定向頁面的HTML? (我更喜歡.NET,但在Java或Python中的代碼片段也可以。Thx!)

回答

5

除非重定向在客戶端完成,否則不能。如果重定向完成服務器端,則實際上不會爲客戶端生成任何html,但頭將在新服務器上重定向。

+0

有趣。我想我以前只見過基於客戶端腳本的重定向,並不知道服務器類型。 (Web dev並不是我的專長;-) +1,謝謝 – 2010-09-07 18:56:18

+0

他希望獲得重定向頁面的來源,而不是被重定向到的頁面。 – CyberDude 2010-09-07 18:56:32

+0

一些糟糕的程序員使網頁發送重定向頭,但忘記停止執行,所以雖然瀏覽器和http客戶端將遵循重定向,但仍然會有沿着線的內容字節。 (通常一個網絡服務器會輸出一些HTML鏈接到目標頁面,對於老客戶和東西)。 – aularon 2010-09-07 18:59:44

-1

最簡單的答案是改向時,當前頁面添加到重定向的查詢字符串組件,例如:

Response.Redirect(newPage + "?FromPage=" + Request.Url); 

那麼新頁面可以通過簡單地看Request.QueryString("FromPage")看到你從甘蔗。

+0

問題是關於可能看到重定向頁面的HTML,而不是URL。 – 2010-09-07 19:03:04

1

需要更多的工作,而不是使用WebClient,請使用HttpWebRequest並將AllowAutoRedirect屬性設置爲False。然後,重定向會引發異常,但您可以從異常的響應對象中獲取任何響應文本(並且某些頁面的確有響應文本和重定向)。收到異常響應後,您可以針對重定向URL(在Location響應頭中指定)發出另一個HttpWebRequest

可能如果你創建一個派生類對象,MyWebRequest,在那裏你重載GetWebRequest方法,並設置AllowAutoRedirect屬性能夠做到與WebRequest類似的東西。我不知道是什麼樣的例外,如果有的話,如果你這樣做,DownloadData方法會返回。

正如有人以前所說,這隻適用於那些做客戶端重定向(通常爲301或302)的頁面。如果服務器端重定向正在進行,你永遠不會知道它。