我有這麼一個需求:
一個域名,xxx.com,它後面其實有很多個iP:比如:
這些ip上面都有同樣的網站,域名解析的時候會隨機分配一個ip給你(這個就是DNS負載均衡)。
但是現在假如我想訪問一個特定IP的上的網站,比如5.6.7.8上的網站,但是由於網站限制了必須通過域名才能訪問,直接把域名改成ip地址形成的url如:http://5.6.7.8/,這樣子是不行的。
有兩種方法:
1. 修改Hosts文件,指定xxx.com 解析到5.6.7.8 上面去。
2. 使用http://5.6.7.8/這個url,不過在請求包的head頭裡增加一句:
Host:xxx.com
由於我是通過C#代碼來實現這個功能,所以就想通過第2種方法解決。
C#中是用HttpWebRequest類來實現獲取一個http請求的。它有一個Header的屬性,可以修改Header裡頭的值。不過查詢MSDN得知,這個Host標識是沒辦法通過這種方法修改的。如果你這麼使用:
httpWebRequest.Headers["Host"] =”xxx.com”;
它會拋出一個異常出來:
ArgumentException: The Host header cannot be modified directly。
那還能不能實現上面的需求呢?答案是能,不過方法要改一下:
Url裡面還是使用域名:
http://xxx.com/
設置HttpWebRequest的Proxy屬性為你想訪問的IP地址即可,如下:
httpWebRequest.Proxy = new WebProxy(ip.ToString());
using System; using System.IO; using System.Net; namespace ConsoleApplication1 { class Program { public static void Main(string[] args) { HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://www.example.com/Default.aspx"); System.Net.WebProxy proxy = new WebProxy("208.77.186.166", 80); request.Proxy = proxy; using (WebResponse response = request.GetResponse()) { using (TextReader reader = new StreamReader(response.GetResponseStream())) { string line; while ((line = reader.ReadLine()) != null) Console.WriteLine(line); } } } } }
這樣子就實現了指定IP的域名請求。
附:有人已經向微軟反饋了無法修改host頭的問題,微軟反饋說下一個.Net Framewok中將增加一個新的Host屬性,這樣子就可以修改Host頭了。
原文:
由 Microsoft 在 2009/5/26 13:37 發送
The next release of the .NET Framework will include a new "Host" property. The value of this property will be sent as "Host" header in the HTTP request.
參考資料: