关于 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"/>
关于 WebRequest.RegisterPrefix相关推荐
- ASP.NET抓取其他网页代码
在.Net 平台下,创建一个ASP.Net的程序 1.引用两个NAMESPACE using System.Text //因为用了Encoding类 using Sys ...
- Silverlight入门:第三部分 - 数据访问
现在我们已经有了一个基础布局,同时也在上面放了一些控件,接下来让我 们开始获取数据.因为我们想要搜索Twitter上的内容,所以我们需要充分使用 他们提供的Web服务API.在继续之前,我要先说明在本 ...
- SilverLight 初探一
今天是本人初次接触银光,以前只听说银光何其的牛叉,却一直没有机会学习.今天恰好有时间,也趁公司机子上装的是VS2010.说到这个,我就来气,我的dell 1420装不上VS2010.今天呢,本人就来个 ...
- C_.NET+Framdwork题库(未整理完,有时间再补)
第一章 Microsof.NET Framework 概述 1..NET Framework 可以运行在下列哪些操作系统之上,并为托管程序提供支持?( ) WindowsNT 4.0 Wind ...
- Lightswitch Desktopclinet 中如何调用WEB API
Lightswitch Desktopclinet 本质就是一个silverlight 桌面客户端程序,当然也有对应的asp.net后台服务,数据的真正处理都在后台端.那也可以尝试以WEB AP ...
- WebClient实现文件下载详解(二)
.Net2.0中新增了很多组件,WebClient就是其中一个,功能也很强大,今天拿WebClient做了一个小实验,只用到了一些很简单的功能就可以实现以前不好实现的功能,很方便. 简单介绍一下Web ...
- 使用WebClient实现文件下载
.Net2.0中新增了很多组件,WebClient就是其中一个,功能也很强大,今天拿WebClient做了一个小实验,只用到了一些很简单的功能就可以实现以前不好实现的功能,很方便. 简单介绍一下Web ...
- 16.网络《果壳中的c#》
16.1 网络体系结构 System.Net.* 命名空间包含各种支持标准网络协议的通信. WebClient 外观类:支持通信HTTP或FTP执行简单的下载/上传操作. WebRequest 和 W ...
- Sl beta4发布了
我想要的功能基本都有了,打印,com,摄像等等. 替代winform没有问题,终于web和win可以走在一起了,接下来用点时间用替换现有的部分模块. Home About Me Contact Arc ...
最新文章
- 转Java转iOS-第一个项目总结(2):遇到问题和解决方案
- opencv Remap 图像的映射
- asp.net超过字数限制用省略号...表示
- 保存的图数据丢失_自从用了这2个功能,再也没有担心过文档丢失
- OSI七层模型的作用
- vim 删除行_【收藏】138条 Vim 命令、操作、快捷键全
- 删除MyEclipse 6.5.1自带的Maven4MyEclipse
- learning scala 变量
- 不搞数字货币的科技巨头们,在区块链的布局上有这三个方向
- html 中word的超链接,word中如何实现添加超链接的方法
- 区块链java开发教程,JAVA区块链项目实战视频课程
- 国际及港澳台电话国家代码表
- python无法读取excel文字_Python帮你做Excel——读取Excel文档
- PLL中的locked信号解析
- php批量改名工具,批量更名大师下载_批量改名大师(Win-Tool之文件批量更名工具) 1.8.7 演示版_极速下载站_软件下载...
- 链栈的基本操作-C语言
- vue 微信公众号 二维码 ios系统长按没有反应,识别不了二维码
- 计算机代码英语,计算机专业英语 (四)(示例代码)
- 11. kafka重试机制解读
- 蓝牙技术|蓝牙Mesh在照明网络上的应用