这是上周在开发c#中使用<代码> 代码>代理代理时开发的一些思考和实践。主要需求是这样的,用户可以配置每次请求是否需要代理,用户可以配置HTTP <代码> 代码>代理,<代码> HTTPS 代码>代理和代理白名单。
还是太年轻
因为一直用的c#网络库中的HttpWebRequest,所以自然而然先去找找看这个网络库有没有封装好我所需要的代理呀,果不其然,被我找到了。自从上次发现某些类对老版本不兼容后,每次在微软官方文档上找到都会翻到最后,查看一下支持的最低框架。
我需要的就是这个代理<代码> 代码>属性,也就是说我最终在发送请求前,设置好这个代理<代码> 代码>属性就可以了。先去看看<代码> 代码>代理类
IWebProxy对象使用代理请求。默认值是通过调用Select属性。
这样的意思就是说我只要构造一个<代码> WebProxy> 代码,然后赋值给<代码> HttpWebRequest.Proxy> 代码就可以了。
看到了<代码> WebProxy> 代码的构造器,马上锁定了
因为我需要用户传的是<代码>字符串> 代码,所以直接这样构造就可以了。然后就是测试了,主管大佬写的<代码>节点。js代码>的<代码> 代码>代理代理o_o先来测试测试
npm安装o_o - g o_o
这样就启动全局安装并启动了代理,在控制台上可以看到监听的是8989端口
(事实) 公共空间HttpProxy () { var=new DescribeAccessPointsRequest请求(); client.SetHttpProxy (http://localhost: 8989); var=client.GetAcsResponse反应(请求); Assert.NotNull (response.HttpResponse.Content); var expectValue=" https://www.yisu.com/zixun/HTTP/1.1 o_o”; 字符串actualValue; response.HttpResponse.Headers。TryGetValue(“通过”,actualValue); 断言。平等(expectValue actualValue); }
如果经过了代理,头部会出现<代码>“HTTP/1.1 o_o”代码>字段,经过英国《金融时报》<代码> 代码>测试,是成功的。
本来一切都没有问题的,除了我自己想的比较简单外,直到我的代码复查了一下组里开发JAVA的人实现这个功能的请求,我才发现我还真的是想的太简单! ! !
首先发现的一点是,我连<代码> 代码>构造函数都用错了,用<代码> ILSpy> 代码反编译了一下,发现<代码> WebProxy(字符串、布尔值、string[])> 代码所作的事。
//System.Net.WebProxy 私有静态Uri CreateProxyUri(字符串地址) { 如果(地址==null) { 返回null; } 如果(address.IndexOf ("://")==1) { 地址=" http://" +地址; } 返回新的Uri(地址); }
即使传进去的是字符串,最后也是构造成Uri,为什么会关注的这个呢?因为我发现有些代理地址是
<代码> http://username: password@localhost: 8989> 代码长这样的,那么我如果直接以这种形式传入到<代码> CreateProxy> 代码里面,它会自动给我分解,然后分<代码>证书代码>和<代码> 代码>代理传入到网络库中吗?接下来就是验证的过程。
首先需要了解到的一个概念:基本访问认证
HTTP事务的上下文中,基本访问认证是一个方法一个HTTP用户代理(例如web浏览器)提供一个用户名和密码时请求。基本HTTP身份验证请求包含一个头字段的表单<代码>授权:基本& lt; credentials> 代码>,凭证是base64编码的id和密码加入了一个冒号。
指定在RFC 7617从2015年开始,从1999年废止RFC 2617。
由于其不安全性,已在RFC中弃用了,转而代之的是TLS SSL那些协议。
问题来了,<代码> HttpWebRequest> 代码中支持<代码>基本身份验证代码>吗?我们可以看到<代码> WebProxy> 代码中有一个构造方法最后一个参数是ICredential的