当前位置: 首页 > news >正文

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

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"/>






本文转自LoveJenny博客园博客,原文链接:http://www.cnblogs.com/LoveJenny/archive/2011/11/22/2258251.html,如需转载请自行联系原作者

相关文章:

  • 慎用margin系列1---CSS的margin塌陷(collapse) 问题与对策
  • Workarounds一词的翻译
  • jquery ui中的dialog,官网上经典的例子
  • screen 后台实时执行命令
  • IP数据包首部校验和的计算
  • 烂泥:rsync与inotify集成实现数据实时同步更新
  • 使用junitamp;spring修改系统的环境变量,解决docker程序测试问题
  • Eclipse下使用Subversion =subclipse
  • 上传附件
  • check_nginx pnp4nagios 模版
  • 统计挖掘那些事那些情(2)-回归分析spss
  • redis应用之主从架构配置
  • android MediaCodec 音频编解码的实现——转码
  • 2014.9.30 Double转字符
  • 【转载】【容斥原理】
  • Google 是如何开发 Web 框架的
  • centos安装java运行环境jdk+tomcat
  • express如何解决request entity too large问题
  • gf框架之分页模块(五) - 自定义分页
  • maven工程打包jar以及java jar命令的classpath使用
  • MD5加密原理解析及OC版原理实现
  • mysql常用命令汇总
  • node.js
  • PAT A1120
  • spring学习第二天
  • supervisor 永不挂掉的进程 安装以及使用
  • Zsh 开发指南(第十四篇 文件读写)
  • 道格拉斯-普克 抽稀算法 附javascript实现
  • 等保2.0 | 几维安全发布等保检测、等保加固专版 加速企业等保合规
  • 前端之React实战:创建跨平台的项目架构
  • 新版博客前端前瞻
  • ​力扣解法汇总946-验证栈序列
  • ###C语言程序设计-----C语言学习(6)#
  • #define与typedef区别
  • #图像处理
  • $HTTP_POST_VARS['']和$_POST['']的区别
  • ( 用例图)定义了系统的功能需求,它是从系统的外部看系统功能,并不描述系统内部对功能的具体实现
  • (13)Latex:基于ΤΕΧ的自动排版系统——写论文必备
  • (js)循环条件满足时终止循环
  • (附源码)spring boot公选课在线选课系统 毕业设计 142011
  • (原創) 如何安裝Linux版本的Quartus II? (SOC) (Quartus II) (Linux) (RedHat) (VirtualBox)
  • (转)Android学习笔记 --- android任务栈和启动模式
  • (转)nsfocus-绿盟科技笔试题目
  • ./和../以及/和~之间的区别
  • .equals()到底是什么意思?
  • .NET Core 通过 Ef Core 操作 Mysql
  • .NET 中创建支持集合初始化器的类型
  • .net解析传过来的xml_DOM4J解析XML文件
  • .NET文档生成工具ADB使用图文教程
  • @ 代码随想录算法训练营第8周(C语言)|Day53(动态规划)
  • @TableLogic注解说明,以及对增删改查的影响
  • [C++] Windows中字符串函数的种类
  • [flask]http请求//获取请求头信息+客户端信息
  • [IE编程] IE8的SDK 下载
  • [java基础揉碎]方法的重写/覆盖