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相关推荐

  1. ASP.NET抓取其他网页代码

    在.Net 平台下,创建一个ASP.Net的程序 1.引用两个NAMESPACE       using System.Text     //因为用了Encoding类       using Sys ...

  2. Silverlight入门:第三部分 - 数据访问

    现在我们已经有了一个基础布局,同时也在上面放了一些控件,接下来让我 们开始获取数据.因为我们想要搜索Twitter上的内容,所以我们需要充分使用 他们提供的Web服务API.在继续之前,我要先说明在本 ...

  3. SilverLight 初探一

    今天是本人初次接触银光,以前只听说银光何其的牛叉,却一直没有机会学习.今天恰好有时间,也趁公司机子上装的是VS2010.说到这个,我就来气,我的dell 1420装不上VS2010.今天呢,本人就来个 ...

  4. C_.NET+Framdwork题库(未整理完,有时间再补)

    第一章  Microsof.NET Framework 概述 1..NET Framework 可以运行在下列哪些操作系统之上,并为托管程序提供支持?(    ) WindowsNT 4.0 Wind ...

  5. Lightswitch Desktopclinet 中如何调用WEB API

     Lightswitch Desktopclinet 本质就是一个silverlight 桌面客户端程序,当然也有对应的asp.net后台服务,数据的真正处理都在后台端.那也可以尝试以WEB AP ...

  6. WebClient实现文件下载详解(二)

    .Net2.0中新增了很多组件,WebClient就是其中一个,功能也很强大,今天拿WebClient做了一个小实验,只用到了一些很简单的功能就可以实现以前不好实现的功能,很方便. 简单介绍一下Web ...

  7. 使用WebClient实现文件下载

    .Net2.0中新增了很多组件,WebClient就是其中一个,功能也很强大,今天拿WebClient做了一个小实验,只用到了一些很简单的功能就可以实现以前不好实现的功能,很方便. 简单介绍一下Web ...

  8. 16.网络《果壳中的c#》

    16.1 网络体系结构 System.Net.* 命名空间包含各种支持标准网络协议的通信. WebClient 外观类:支持通信HTTP或FTP执行简单的下载/上传操作. WebRequest 和 W ...

  9. Sl beta4发布了

    我想要的功能基本都有了,打印,com,摄像等等. 替代winform没有问题,终于web和win可以走在一起了,接下来用点时间用替换现有的部分模块. Home About Me Contact Arc ...

最新文章

  1. 转Java转iOS-第一个项目总结(2):遇到问题和解决方案
  2. opencv Remap 图像的映射
  3. asp.net超过字数限制用省略号...表示
  4. 保存的图数据丢失_自从用了这2个功能,再也没有担心过文档丢失
  5. OSI七层模型的作用
  6. vim 删除行_【收藏】138条 Vim 命令、操作、快捷键全
  7. 删除MyEclipse 6.5.1自带的Maven4MyEclipse
  8. learning scala 变量
  9. 不搞数字货币的科技巨头们,在区块链的布局上有这三个方向
  10. html 中word的超链接,word中如何实现添加超链接的方法
  11. 区块链java开发教程,JAVA区块链项目实战视频课程
  12. 国际及港澳台电话国家代码表
  13. python无法读取excel文字_Python帮你做Excel——读取Excel文档
  14. PLL中的locked信号解析
  15. php批量改名工具,批量更名大师下载_批量改名大师(Win-Tool之文件批量更名工具) 1.8.7 演示版_极速下载站_软件下载...
  16. 链栈的基本操作-C语言
  17. vue 微信公众号 二维码 ios系统长按没有反应,识别不了二维码
  18. 计算机代码英语,计算机专业英语 (四)(示例代码)
  19. 11. kafka重试机制解读
  20. 蓝牙技术|蓝牙Mesh在照明网络上的应用

热门文章

  1. python中的itemgetter函数
  2. Android数据存储(1):SharedPreferences
  3. python中的ord,chr函数
  4. 第三方平台也能为未微信认证的订阅号调用自定义菜单接口和素材管理接口
  5. hdu2063+hdu1083(最大匹配数)
  6. CSS的50个代码片段
  7. Android的多媒体框架OpenCore介绍
  8. good archtchre article
  9. 【重点】LeetCode 143. Reorder List
  10. 矩阵相关的一些中英文对照术语