.NET中代理服务器WebProxy的各种用法
引用地址
因為涉及到代理的各種情況,WebRequest和WebProxy類的文檔寫的相當復雜,不但各個文檔關注點不同,而且不同版本的同一文檔也有小小的區別,網上也沒有關于這個類的相關文章。于是乎這篇Blog是我鉆研半天MSDN很久后總結并且花了一小時憋出來的,希望下面的內容能幫到大家。
(AcDown中也使用了相關的代碼,有興趣的可以找來看看【解析】.NET中代理服務器WebProxy的各種用法)
直接進入正題,對于需要使用WebProxy類的情況,大致分如下幾種:
1、創建WebRequest的時候,沒有刻意設置代理(默認情況)
2、使用Internet Explorer代理
3、使用應用程序配置文件中的代理
4、不使用代理
5、使用.NET框架默認設置的代理
6、使用WPAD配置腳本自動設置的代理
7、使用IE+應用程序配置文件的混合代理
8、使用IE代理但禁用自動代理檢測(WPAD)
怎么樣,很混亂吧。當然上面這些很多都是重復的,不過基本已經涵蓋了所有可能遇到的情況,下面讓我來一個一個說說:
1、默認情況下的代理設置
當創建一個新的HTTP請求時(WebRequest.Create方法),得到的HttpWebRequest類會自動初始化它的Proxy屬性,那么這個屬性的默認值是什么呢?MSDN中說:
如果配置文件中未指定代理并且未指定 Proxy 屬性,則 HttpWebRequest 類使用從本地計算機上的 Internet Explorer 中繼承的代理設置。 如果 Internet Explorer 中沒有代理設置,請求會直接發送到服務器。
這段話中,說到Proxy屬性使用的其實就是默認代理,這個默認代理默認來自于IE,如果IE沒有設置代理,那么就會直接連接到目標服務器。為什么要說“默認代理默認來自于IE”呢?因為這個“默認來自于IE”也是可以修改的,通過修改WebProxy.DefaultWebProxy屬性,你可以控制每次新建請求時所使用的默認代理:
DefaultWebProxy 屬性從 app.config 文件中讀取代理服務器設置。 如果沒有配置文件,則使用當前用戶的 Internet Explorer (IE) 代理設置。
如果 DefaultWebProxy 屬性設置為 null,則使用 Create 或 CreateDefault 方法創建的 WebRequest 類的所有后續實例都沒有代理。
這里需要注意的是,如果DefaultWebProxy設置為null,并不意味著WebRequest的Proxy屬性也是null,這兩個null表示的意義不同。
2、使用IE代理,但不使用任何動態設置
最簡單的方法是將Proxy屬性設置為WebProxy.GetDefaultProxy,GetDefaultProxy會讀取當前計算機上的IE代理設置,同時忽略掉所有動態設置的內容:
GetDefaultProxy 方法讀取 Internet Explorer 5.5 和更高版本存儲的非動態代理設置并使用這些設置創建 WebProxy 實例。
GetDefaultProxy 方法不獲取從 Internet Explorer 運行的腳本、從自動配置項或者從 DHCP 或 DNS 查找生成的任何動態設置。
但是這個API已經過時,所以現在我推薦的方法是:將Proxy屬性設置為null:
http://msdn.microsoft.com/zh-cn/library/fze2ytx2(v=vs.80).aspx
3、使用IE代理,同時使用各種動態配置項
這個是比較簡單的了,當然這種情況還是會包含兩種小的情況:
(1)使用app.config中的配置:將Proxy屬性設置為 WebProxy.DefaultWebProxy
(2)不使用app.config中的配置:將Proxy屬性設置為 WebRequest.GetSystemWebProxy()
GetSystemWebProxy 方法讀取當前用戶的 Internet Explorer (IE) 代理設置。 此進程包括 IE 選項來自動檢測代理設置,請使用自動配置腳本、手動代理服務器設置和高級手動代理服務器設置。
4、不使用任何代理
不使用任何代理的方法是:創建一個WebProxy類的新實例:
默認構造函數通過將 Address 屬性設置為 null 來初始化 WebProxy 類的空實例。
Address 屬性為 null 時,IsBypassed 方法返回 true,且 GetProxy 方法返回目標地址。
另外再來看看Address屬性的說明:
Address 屬性包含代理服務器的地址。 如果未啟用自動代理檢測并且未指定自動配置腳本,則 Address 屬性與 BypassList 共同確定用于請求的代理。
當 Address 屬性為 null 時,請求回避此代理并且直接連接到目標主機。
綜上所述,也就是說,當使用無參構造函數創建一個新的WebProxy對象時(req.Proxy = new WebProxy();),這個請求會繞過所有代理服務器直接連接目標服務器。
5、其他
關于如何設置app.config/machine.config配置文件中的代理設置:
元素:http://msdn.microsoft.com/zh-cn/library/kd3cf2ex
元素:http://msdn.microsoft.com/zh-cn/library/sa91de1e(v=vs.100).aspx
總結
以上是生活随笔為你收集整理的.NET中代理服务器WebProxy的各种用法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Spring Cloud Alibaba
- 下一篇: UX、UI、 IA和IxD