欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

基于WebRequest.RegisterPrefix的使用详解

程序员文章站 2023-12-16 23:44:10
registerprefix 方法将 webrequest 子代注册到服务请求。 webrequest 后代通常被注册来处理特定的协议(例如 http 或 ftp),但也可...

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 方法了。

基于WebRequest.RegisterPrefix的使用详解


 第一个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"/>

上一篇:

下一篇: