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