c#中HttpWebRequest使用Proxy實現指定IP的域名請求
我有這麼一個需求:
一個域名,xxx.com,它後面其實有很多個iP:比如:
1.2.3.4,
5.6.7.8,
9.10.11.12
這些ip上面都有同樣的網站,域名解析的時候會隨機分配一個ip給你(這個就是DNS負載均衡)。
但是現在假如我想訪問一個特定IP的上的網站,比如5.6.7.8上的網站,但是由於網站限制了必須通過域名才能訪問,直接把域名改成ip地址形成的url如:http://5.6.7.8/,這樣子是不行的。
怎麼辦呢?
有兩種方法:
- 修改Hosts檔案,指定xxx.com 解析到5.6.7.8 上面去。
- 使用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.
參考資料:
HttpWebRequest.Headers[“Host”] throws an unexpected exception
相關文章
- C#:使用HttpWebRequest後保持Session,再使用一個HttpWebRequest實現瀏覽、下載等效果C#HTTPWebSession
- 使用 http-proxy 實現 SAP UI5 請求的代理重定向HTTPUI
- C# 實現http不同方法的請求C#HTTP
- C#中HttpWebRequest發起HTTP請求,如何設定才能達到最大併發和效能C#HTTPWeb
- 在Java中,使用HttpUtils實現傳送HTTP請求JavaHTTP
- 在 DotNetty 中實現同步請求Netty
- C#利用 HttpWebRequest 類傳送post請求,出現“套接字(協議/網路地址/埠)只允許使用一次”問題C#HTTPWeb協議
- 使用 Promise 實現任務佇列傳送請求,實現最大請求數目限制Promise佇列
- 使用 http-proxy 對網路請求進行代理HTTP
- 使用Retrofit+RxJava實現網路請求RxJava
- 爬蟲中的TCP請求自動切換ip爬蟲TCP
- JS實現序列請求JS
- Java實現Http請求JavaHTTP
- 使用js閉包實現可取消的axios請求JSiOS
- 使用 Proxy 實現簡單的 MVVM 模型MVVM模型
- Java中實現並行請求兩種方式Java並行
- openwrt 設定內網域名解析到指定ip內網
- 使用 http-proxy 代理 SAP UI5 應用發起的 HTTP 請求HTTPUI
- 用whistle實現Abort請求
- KKB : Jquery實現Ajax請求jQuery
- 爬蟲實現:根據IP地址反查域名爬蟲
- 分分鐘使用Retrofit+Rxjava實現網路請求RxJava
- 簡單介紹shell中的curl網路請求的實現
- Requests如何在Python爬蟲中實現get請求?Python爬蟲
- 如何使用 request-promise 在傳送請求時使用代理ip?Promise
- apisix~按域名進行請求轉發API
- Post請求域名Nginx返回405報錯Nginx
- Java後端中的請求最佳化:從請求合併到非同步處理的實現策略Java後端非同步
- 使用 http-proxy 代理 HTTP 請求時遇到的 the requested url is invalid 錯誤訊息HTTP
- 簡單的實現jsonp跨域請求JSON跨域
- Android使用Kotlin+Retrofit+Rxjava實現簡單的網路請求AndroidKotlinRxJava
- C# 請求的名稱有效,但是找不到請求的型別的資料C#型別
- 大佬們,jmeter 中替換請求 body,使用 addNonEncodedArgument 發現實際請求是空的,這是為啥呢JMeterNone
- 解析Fetch實現請求資料
- 利用fetch方法實現Ajax請求
- 禁止頻繁請求的ip訪問nginxNginx
- SpringMVC中如何傳送GET請求、POST請求、PUT請求、DELETE請求。SpringMVCdelete
- 用Python實現批次掃描域名是否存在指定檔案Python