2008-11-24 25 views
1

我有一個Web服務,充當網站和一些分析軟件的一個接口場的接口。部分分析跟蹤需要收集頁面標題。我想用HTTPWebRequest來呼叫該頁面,而不是將它從網頁傳遞到Web服務。使用HTTPWebRequest獲取遠程頁面的標題

我有代碼可以獲取整個頁面並解析出html來獲取標題標記,但我不想下載整個頁面來獲取頭部信息。

我已經開始與

HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create("url"); 
request.Method = "HEAD"; 

回答

4

好主意,但HEAD請求僅返回文檔的HTTP標頭。這不包括標題元素,它是HTTP消息主體的一部分。

+0

所以反正是有得到這個信息,而無需下載整個頁面? – 2008-11-24 16:31:37

+0

好吧,你可以閱讀塊中的響應,但我認爲即使你沒有處理它,框架本身也會收到整個響應。 – Powerlord 2008-11-24 17:23:42

-1

所以我會去喜歡的東西......

HttpWebRequest req = (HttpWebRequest)WebRequest.Create(URL); 
HttpWebResponse resp = (HttpWebResponse)req.GetResponse(); 
Stream st   = resp.GetResponseStream(); 
StreamReader sr  = new StreamReader(st); 
string buffer  = sr.ReadToEnd(); 
int startPos, endPos; 
startPos = buffer.IndexOf("<title>", 
StringComparison.CurrentCultureIgnoreCase) + 7; 
endPos = buffer.IndexOf("</title>", 
StringComparison.CurrentCultureIgnoreCase); 
string title = buffer.Substring(startPos, endPos - startPos); 
Console.WriteLine("Response code from {0}: {1}", s, 
     resp.StatusCode); 
Console.WriteLine("Page title: {0}", title); 
sr.Close(); 
st.Close(); 
0

如果你不想請求整個頁面,你可以在片提出要求。 http規範定義了一個名爲Range的http頭。你會使用它象下面這樣:

範圍:字節= 0-100

您可以瀏覽返回的內容並找到稱號。如果它不在那裏,那麼請求範圍:101-200等,直到你得到你需要的。

顯然,網絡服務器需要支持範圍,所以這可能會被擊中或錯過。

2

試試這個:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Net; 
using System.IO; 
using System.Text.RegularExpressions; 

namespace ConsoleApplication2 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      string page = @"http://stackoverflow.com/"; 
      HttpWebRequest req = (HttpWebRequest)HttpWebRequest.Create(page); 
      StreamReader SR = new StreamReader(req.GetResponse().GetResponseStream()); 

      Char[] buf = new Char[256]; 
      int count = SR.Read(buf, 0, 256); 
      while (count > 0) 
      { 
       String outputData = new String(buf, 0, count); 
       Match match = Regex.Match(outputData, @"<title>([^<]+)", RegexOptions.IgnoreCase); 
       if (match.Success) 
       { 
        Console.WriteLine(match.Groups[1].Value); 
       } 
       count = SR.Read(buf, 0, 256); 
      } 
     } 

    } 
}