源码网商城,靠谱的源码在线交易网站 我的订单 购物车 帮助

源码网商城

基于WebRequest.RegisterPrefix的使用详解

  • 时间:2021-07-15 18:29 编辑: 来源: 阅读:
  • 扫一扫,手机访问
摘要:基于WebRequest.RegisterPrefix的使用详解
RegisterPrefix 方法将 WebRequest 子代注册到服务请求。 WebRequest 后代通常被注册来处理特定的协议(例如 HTTP 或 FTP),但也可能被注册来处理对特定服务器或服务器上的路径的请求。 [b]已注册的预注册保留类型包括下列类型:[/b]     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"/> [b]这样有什么问题吗?[/b] 这样直接绑定会抛出异常,因为ftp需要用户名,密码登陆后才能访问资源。 可以采用间接的方式,例如在C#代码中使用WebClient来获取FtpUrl 的Stream,然后进行处理。 所以代码中会有大量的 webClient.Credentials = new NetworkCredential("WQ", "123456"); 当然了,你也可以使用Factory模式来处理,不过总的感觉,很麻烦。 其实微软很早就发现了这类问题,所以WebClient才提供了WebClient.Create 的方法,看到Create让你想到了什么吗?,没错,就是工厂。 如果我们能够让所有提交到ftp://192.168.0.1 的WebClient都自动的加上Credentials那就解决了这个问题,而如何实现这个功能,那就需要使用RegisterPrefix 方法了。 [img]http://files.jb51.net/file_images/article/201305/20130513155816121.png[/img]  第一个prefix,是前缀的意思,例如 ftp://192.168.0.1 ,那么以后针对这个prefix的所有请求都会自动的调用creator 的Create方法来创建WebRequest 对象。之所以创建的是WebRequest对象,是因为WebClient也继承自WebRequest。 所以你new WebClient 的时候,内部会调用WebRequest.Create 方法返回的WebRequest. 所以需要新建一个[b]CredentialsWebRequestCreater[/b]类来继承[b]IWebRequestCreate [/b]  代码如下:
[u]复制代码[/u] 代码如下:
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;     } }
这个类实现了[b]IWebRequestCreate[/b]接口,所以可以被[b]RegisterPrefix[/b]方法调用。 [b]如何使用RegisterPrefix方法呢? [/b]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"/>
  • 全部评论(0)
联系客服
客服电话:
400-000-3129
微信版

扫一扫进微信版
返回顶部