-
C#教程之基于WebRequest.RegisterPrefix的使用详解
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 方法了。
第一个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"/>
已注册的预注册保留类型包括下列类型:
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 方法了。
第一个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"/>
栏目列表
最新更新
nodejs爬虫
Python正则表达式完全指南
爬取豆瓣Top250图书数据
shp 地图文件批量添加字段
爬虫小试牛刀(爬取学校通知公告)
【python基础】函数-初识函数
【python基础】函数-返回值
HTTP请求:requests模块基础使用必知必会
Python初学者友好丨详解参数传递类型
如何有效管理爬虫流量?
SQL SERVER中递归
2个场景实例讲解GaussDB(DWS)基表统计信息估
常用的 SQL Server 关键字及其含义
动手分析SQL Server中的事务中使用的锁
openGauss内核分析:SQL by pass & 经典执行
一招教你如何高效批量导入与更新数据
天天写SQL,这些神奇的特性你知道吗?
openGauss内核分析:执行计划生成
[IM002]Navicat ODBC驱动器管理器 未发现数据
初入Sql Server 之 存储过程的简单使用
这是目前我见过最好的跨域解决方案!
减少回流与重绘
减少回流与重绘
如何使用KrpanoToolJS在浏览器切图
performance.now() 与 Date.now() 对比
一款纯 JS 实现的轻量化图片编辑器
关于开发 VS Code 插件遇到的 workbench.scm.
前端设计模式——观察者模式
前端设计模式——中介者模式
创建型-原型模式