zoukankan      html  css  js  c++  java
  • 关于 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
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
  • 相关阅读:
    Java多线程
    JVM的结构
    CURL POST 请求
    网页504超时 apache php
    Web服务器超时处理
    apache自带压力测试工具ab详解
    好用的日期组件My97DatePicker
    CI源码阅读
    apache rewrite规则详解
    安装mysqli 扩展
  • 原文地址:https://www.cnblogs.com/LoveJenny/p/2258251.html
Copyright © 2011-2022 走看看