基于WebRequest.RegisterPrefix的使用詳解
RegisterPrefix 方法將 WebRequest 子代注冊(cè)到服務(wù)請(qǐng)求。 WebRequest 后代通常被注冊(cè)來(lái)處理特定的協(xié)議(例如 HTTP 或 FTP),但也可能被注冊(cè)來(lái)處理對(duì)特定服務(wù)器或服務(wù)器上的路徑的請(qǐng)求。
已注冊(cè)的預(yù)注冊(cè)保留類(lèi)型包括下列類(lèi)型:
http://
https://
ftp://
file://
msdn的解釋是:將WebRequest子代注冊(cè)到服務(wù)請(qǐng)求,很短,很抽象,不夠白話(huà),如果你一開(kāi)始就理解這句話(huà)的意思,那我只能說(shuō)你的智商很高,技術(shù)也很好。
我先不說(shuō)RegisterPrefix是什么意思,先看下我碰到的問(wèn)題。
在http上傳 vs ftp上傳中,因?yàn)橛写笪募?并且客戶(hù)端是wpf,所以我選擇了ftp上傳,結(jié)果就是文件的上傳路徑是:
ftp://192.168.0.1/ 6be490e3-d383-4167-8cbd-b833f31d855cDesert.jpg
ftp 的用戶(hù)名是WQ,密碼是123456.
因?yàn)閒tp的路徑是圖片,所以我嘗試綁定到圖片上,例如
<Image Source="{Binding FtpUrl}" Height="32" Stretch="Uniform"/>
這樣有什么問(wèn)題嗎?
這樣直接綁定會(huì)拋出異常,因?yàn)閒tp需要用戶(hù)名,密碼登陸后才能訪(fǎng)問(wèn)資源。
可以采用間接的方式,例如在C#代碼中使用WebClient來(lái)獲取FtpUrl 的Stream,然后進(jìn)行處理。
所以代碼中會(huì)有大量的
webClient.Credentials = new NetworkCredential("WQ", "123456");
當(dāng)然了,你也可以使用Factory模式來(lái)處理,不過(guò)總的感覺(jué),很麻煩。
其實(shí)微軟很早就發(fā)現(xiàn)了這類(lèi)問(wèn)題,所以WebClient才提供了WebClient.Create 的方法,看到Create讓你想到了什么嗎?,沒(méi)錯(cuò),就是工廠(chǎng)。
如果我們能夠讓所有提交到ftp://192.168.0.1 的WebClient都自動(dòng)的加上Credentials那就解決了這個(gè)問(wèn)題,而如何實(shí)現(xiàn)這個(gè)功能,那就需要使用RegisterPrefix 方法了。
第一個(gè)prefix,是前綴的意思,例如 ftp://192.168.0.1 ,那么以后針對(duì)這個(gè)prefix的所有請(qǐng)求都會(huì)自動(dòng)的調(diào)用creator 的Create方法來(lái)創(chuàng)建WebRequest 對(duì)象。之所以創(chuàng)建的是WebRequest對(duì)象,是因?yàn)閃ebClient也繼承自WebRequest。 所以你new WebClient 的時(shí)候,內(nèi)部會(huì)調(diào)用WebRequest.Create 方法返回的WebRequest.
所以需要新建一個(gè)CredentialsWebRequestCreater類(lèi)來(lái)繼承IWebRequestCreate
代碼如下:
public class CredentialsWebRequestCreater:IWebRequestCreate
{
private string userName = string.Empty;
private string password = string.Empty;
public CredentialsWebRequestCreater(string userName, string password)
{
this.userName = userName;
this.password = password;
}
public WebRequest Create(Uri uri)
{
WebRequest webRequest = WebRequest.CreateDefault(uri);
webRequest.Credentials = new NetworkCredential(this.userName, this.password);
return webRequest;
}
}
這個(gè)類(lèi)實(shí)現(xiàn)了IWebRequestCreate接口,所以可以被RegisterPrefix方法調(diào)用。
如何使用RegisterPrefix方法呢?
System.Net.WebRequest.RegisterPrefix(“ftp://192.168.0.1”,
new Utils.CredentialsWebRequestCreater(“WQ”,”123456”));
這樣注冊(cè)后,以后所有的對(duì)ftp://192.168.0.1 的請(qǐng)求都會(huì)使用CredentialsWebRequestCreater 來(lái)創(chuàng)建WebRequest對(duì)象了,而CredentialsWebRequestCreater 類(lèi)的Create方法就會(huì)去添加用戶(hù)名和密碼了。
這樣就可以直接綁定了,例如:
<Image Source="{Binding FtpUrl}" Height="32" Stretch="Uniform"/>
相關(guān)文章
C#雙向鏈表LinkedList排序?qū)崿F(xiàn)方法
這篇文章主要介紹了C#雙向鏈表LinkedList排序?qū)崿F(xiàn)方法,涉及C#雙向鏈表的定義與排序技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-08-08C#基礎(chǔ)入門(mén)之值類(lèi)型和引用類(lèi)型的區(qū)別詳析
在C#中值類(lèi)型的變量直接存儲(chǔ)數(shù)據(jù),而引用類(lèi)型的變量持有的是數(shù)據(jù)的引用,數(shù)據(jù)存儲(chǔ)在數(shù)據(jù)堆中,下面這篇文章主要給大家介紹了關(guān)于C#基礎(chǔ)入門(mén)之值類(lèi)型和引用類(lèi)型區(qū)別的相關(guān)資料,需要的朋友可以參考下2021-09-09總結(jié)C#動(dòng)態(tài)調(diào)用WCF接口的兩種方法
這篇文章給大家總結(jié)了C#動(dòng)態(tài)調(diào)用WCF接口的兩種方法,大家可以根據(jù)自己的需求選擇對(duì)應(yīng)的方式,下面來(lái)一起看看。2016-09-09WinForm實(shí)現(xiàn)按名稱(chēng)遞歸查找控件的方法
這篇文章主要介紹了WinForm實(shí)現(xiàn)按名稱(chēng)遞歸查找控件的方法,需要的朋友可以參考下2014-08-08C#泛型集合類(lèi)型實(shí)現(xiàn)添加和遍歷
這篇文章介紹了C#泛型集合類(lèi)型實(shí)現(xiàn)添加和遍歷的方法,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-08-08C#鍵盤(pán)輸入回車(chē)鍵實(shí)現(xiàn)點(diǎn)擊按鈕效果的方法
這篇文章主要介紹了C#鍵盤(pán)輸入回車(chē)鍵實(shí)現(xiàn)點(diǎn)擊按鈕效果的方法,可實(shí)現(xiàn)用回車(chē)鍵代替點(diǎn)擊按鈕的功能,是非常實(shí)用的技巧,需要的朋友可以參考下2014-09-09