a亚洲精品_精品国产91乱码一区二区三区_亚洲精品在线免费观看视频_欧美日韩亚洲国产综合_久久久久久久久久久成人_在线区

首頁 > 編程 > C# > 正文

基于WebRequest.RegisterPrefix的使用詳解

2020-01-24 03:21:19
字體:
供稿:網(wǎng)友

RegisterPrefix 方法將 WebRequest 子代注冊(cè)到服務(wù)請(qǐng)求。 WebRequest 后代通常被注冊(cè)來處理特定的協(xié)議(例如 HTTP 或 FTP),但也可能被注冊(cè)來處理對(duì)特定服務(wù)器或服務(wù)器上的路徑的請(qǐng)求。

已注冊(cè)的預(yù)注冊(cè)保留類型包括下列類型:

    http://

    https://

    ftp://

    file://

msdn的解釋是:將WebRequest子代注冊(cè)到服務(wù)請(qǐng)求,很短,很抽象,不夠白話,如果你一開始就理解這句話的意思,那我只能說你的智商很高,技術(shù)也很好。

我先不說RegisterPrefix是什么意思,先看下我碰到的問題。

在http上傳 vs ftp上傳中,因?yàn)橛写笪募?并且客戶端是wpf,所以我選擇了ftp上傳,結(jié)果就是文件的上傳路徑是:

ftp://192.168.0.1/ 6be490e3-d383-4167-8cbd-b833f31d855cDesert.jpg

ftp 的用戶名是WQ,密碼是123456.

因?yàn)閒tp的路徑是圖片,所以我嘗試綁定到圖片上,例如

<Image Source="{Binding FtpUrl}" Height="32" Stretch="Uniform"/>

這樣有什么問題嗎?

這樣直接綁定會(huì)拋出異常,因?yàn)閒tp需要用戶名,密碼登陸后才能訪問資源。

可以采用間接的方式,例如在C#代碼中使用WebClient來獲取FtpUrl 的Stream,然后進(jìn)行處理。

所以代碼中會(huì)有大量的

webClient.Credentials = new NetworkCredential("WQ", "123456");

當(dāng)然了,你也可以使用Factory模式來處理,不過總的感覺,很麻煩。

其實(shí)微軟很早就發(fā)現(xiàn)了這類問題,所以WebClient才提供了WebClient.Create 的方法,看到Create讓你想到了什么嗎?,沒錯(cuò),就是工廠。

如果我們能夠讓所有提交到ftp://192.168.0.1 的WebClient都自動(dòng)的加上Credentials那就解決了這個(gè)問題,而如何實(shí)現(xiàn)這個(gè)功能,那就需要使用RegisterPrefix 方法了。

image


 第一個(gè)prefix,是前綴的意思,例如 ftp://192.168.0.1 ,那么以后針對(duì)這個(gè)prefix的所有請(qǐng)求都會(huì)自動(dòng)的調(diào)用creator 的Create方法來創(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類來繼承IWebRequestCreate
 
代碼如下:

復(fù)制代碼 代碼如下:

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è)類實(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 來創(chuàng)建WebRequest對(duì)象了,而CredentialsWebRequestCreater 類的Create方法就會(huì)去添加用戶名和密碼了。

這樣就可以直接綁定了,例如:
<Image Source="{Binding FtpUrl}" Height="32" Stretch="Uniform"/>

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: www污在线观看 | 亚洲一区二区三区视频 | 操操操夜夜操 | 日本xxxx网站 | 成人精品视频99在线观看免费 | 成人黄色在线视频 | 偷拍亚洲精品 | 亚洲男人av | 欧美日韩第一区 | 亚洲福利一区 | 久久激情视频 | 国产精品99久久久久久久久 | 一区二区三区的视频 | 亚洲欧美国产精品久久久久 | 亚洲精品久久久久久一区二区 | 日韩成人激情 | 综合久久网 | 国产精品18久久久久久首页狼 | 欧美在线视频一区 | 免费精品视频在线观看 | 欧美一区在线看 | 一区二区久久 | 久久精彩视频 | 一区二区三区国产精品 | 日本三级视频在线播放 | 国产日韩视频在线播放 | 99视频精品| 国产精品一区二区在线 | 国产真实精品久久二三区 | 久久99国产精品久久99大师 | 午夜a级理论片915影院 | 日韩精品中文字幕一区二区三区 | 日韩在线观看中文字幕 | 欧美视频网址 | 国产一二三区在线观看 | 91视频.www| 超碰在线91| 91精品久久久久久久久入口 | 日韩精品一区二区三区 | 91精品一区二区三区久久久久久 | 草草草影院 |