基于WebRequest.RegisterPrefix的使用详解

所属分类: 软件编程 / C#教程 阅读数: 100
收藏 0 赞 0 分享

RegisterPrefix 方法将 WebRequest 子代注册到服务请求。 WebRequest 后代通常被注册来处理特定的协议(例如 HTTP 或 FTP),但也可能被注册来处理对特定服务器或服务器上的路径的请求。

已注册的预注册保留类型包括下列类型:

    http://

    https://

    ftp://

    file://

msdn的解释是:将WebRequest子代注册到服务请求,很短,很抽象,不够白话,如果你一开始就理解这句话的意思,那我只能说你的智商很高,技术也很好。

我先不说RegisterPrefix是什么意思,先看下我碰到的问题。

在http上传 vs ftp上传中,因为有大文件,并且客户端是wpf,所以我选择了ftp上传,结果就是文件的上传路径是:

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

ftp 的用户名是WQ,密码是123456.

因为ftp的路径是图片,所以我尝试绑定到图片上,例如

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

这样有什么问题吗?

这样直接绑定会抛出异常,因为ftp需要用户名,密码登陆后才能访问资源。

可以采用间接的方式,例如在C#代码中使用WebClient来获取FtpUrl 的Stream,然后进行处理。

所以代码中会有大量的

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

当然了,你也可以使用Factory模式来处理,不过总的感觉,很麻烦。

其实微软很早就发现了这类问题,所以WebClient才提供了WebClient.Create 的方法,看到Create让你想到了什么吗?,没错,就是工厂。

如果我们能够让所有提交到ftp://192.168.0.1 的WebClient都自动的加上Credentials那就解决了这个问题,而如何实现这个功能,那就需要使用RegisterPrefix 方法了。

image


 第一个prefix,是前缀的意思,例如 ftp://192.168.0.1 ,那么以后针对这个prefix的所有请求都会自动的调用creator 的Create方法来创建WebRequest 对象。之所以创建的是WebRequest对象,是因为WebClient也继承自WebRequest。 所以你new WebClient 的时候,内部会调用WebRequest.Create 方法返回的WebRequest.

所以需要新建一个CredentialsWebRequestCreater类来继承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;
    }
}

这个类实现了IWebRequestCreate接口,所以可以被RegisterPrefix方法调用。

如何使用RegisterPrefix方法呢?
System.Net.WebRequest.RegisterPrefix(“ftp://192.168.0.1”,
                    new Utils.CredentialsWebRequestCreater(“WQ”,”123456”));
这样注册后,以后所有的对ftp://192.168.0.1 的请求都会使用CredentialsWebRequestCreater 来创建WebRequest对象了,而CredentialsWebRequestCreater 类的Create方法就会去添加用户名和密码了。

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

更多精彩内容其他人还在看

C#抽象类与抽象方法详解

这篇文章主要为大家详细介绍了C#抽象类与抽象方法的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
收藏 0 赞 0 分享

C#代码实现扑克牌排序的几种方式

今天小编就为大家分享一篇关于C#代码实现扑克牌排序,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
收藏 0 赞 0 分享

C#泛型概念的简介与泛型的使用

今天小编就为大家分享一篇关于C#泛型概念的简介与泛型的使用,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
收藏 0 赞 0 分享

C# 7.0 使用下划线忽略使用的变量的原因分析

这篇文章主要介绍了C# 7.0 使用下划线忽略使用的变量的原因浅析,本文通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
收藏 0 赞 0 分享

C# 中使用正则表达式匹配字符的含义

正则表达式的作用用来描述字符串的特征。本文重点给大家介绍C# 中使用正则表达式匹配字符的含义,非常不错,具有一定的参考借鉴价值,需要的朋友参考下吧
收藏 0 赞 0 分享

C# Dictionary和SortedDictionary的简介

今天小编就为大家分享一篇关于C# Dictionary和SortedDictionary的简介,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
收藏 0 赞 0 分享

C#中SQL Command的基本用法

今天小编就为大家分享一篇关于C#中SQL Command的基本用法,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
收藏 0 赞 0 分享

C#使用SQL DataReader访问数据的优点和实例

今天小编就为大家分享一篇关于C#使用SQL DataReader访问数据的优点和实例,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
收藏 0 赞 0 分享

C#使用SQL Dataset数据集代码实例

今天小编就为大家分享一篇关于的文章,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
收藏 0 赞 0 分享

C#使用SQL DataAdapter数据适配代码实例

今天小编就为大家分享一篇关于C#使用SQL DataAdapter数据适配代码实例,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
收藏 0 赞 0 分享
查看更多