.NET中代理服务器WebProxy的各种用法

.NET中代理服务器WebProxy的各种用法因为涉及到代理的各种情况,WebRequest和WebProxy类的文档写的相当复杂,不但各个文档关注点不同,而且不同版本的同一文档也有小小的区别,网上也没有关于这个类的相关文章。于是乎这篇Blog是我钻研半天MSDN很久后总结并且花了一小时憋出来的,希望下面的内容能帮到大家。(AcDown中也使用了相关的代码,有兴趣的可以找来看看【解析】.NET中代理服务器WebProxy的各种用法)直接进入

大家好,又见面了,我是你们的朋友全栈君。

因为涉及到代理的各种情况,WebRequest和WebProxy类的文档写的相当复杂,不但各个文档关注点不同,而且不同版本的同一文档也有小小的区别,网上也没有关于这个类的相关文章。
(AcDown中也使用了相关的代码,有兴趣的可以找来看看【解析】.NET中代理服务器WebProxy的各种用法)

直接进入正题,对于需要使用WebProxy类的情况,大致分如下几种:
1、创建WebRequest的时候,没有刻意设置代理(默认情况)
2、使用Internet Explorer代理
3、使用应用程序配置文件中的代理
4、不使用代理
5、使用.NET框架默认设置的代理
6、使用WPAD配置脚本自动设置的代理
7、使用IE+应用程序配置文件的混合代理
8、使用IE代理但禁用自动代理检测(WPAD)

怎么样,很混乱吧。当然上面这些很多都是重复的,不过基本已经涵盖了所有可能遇到的情况,下面让我来一个一个说说:

1、默认情况下的代理设置

当创建一个新的HTTP请求时(WebRequest.Create方法),得到的HttpWebRequest类会自动初始化它的Proxy属性,那么这个属性的默认值是什么呢?MSDN中说:

如果配置文件中未指定代理并且未指定 Proxy 属性,则 HttpWebRequest 类使用从本地计算机上的 Internet Explorer 中继承的代理设置。 如果 Internet Explorer 中没有代理设置,请求会直接发送到服务器。

这段话中,说到Proxy属性使用的其实就是默认代理,这个默认代理默认来自于IE,如果IE没有设置代理,那么就会直接连接到目标服务器。为什么要说“默认代理默认来自于IE”呢?因为这个“默认来自于IE”也是可以修改的,通过修改WebProxy.DefaultWebProxy属性,你可以控制每次新建请求时所使用的默认代理:

DefaultWebProxy 属性从 app.config 文件中读取代理服务器设置。 如果没有配置文件,则使用当前用户的 Internet Explorer (IE) 代理设置。
如果 DefaultWebProxy 属性设置为 null,则使用 Create 或 CreateDefault 方法创建的 WebRequest 类的所有后续实例都没有代理。
这里需要注意的是,如果DefaultWebProxy设置为null,并不意味着WebRequest的Proxy属性也是null,这两个null表示的意义不同。

2、使用IE代理,但不使用任何动态设置

最简单的方法是将Proxy属性设置为WebProxy.GetDefaultProxy,GetDefaultProxy会读取当前计算机上的IE代理设置,同时忽略掉所有动态设置的内容:
GetDefaultProxy 方法读取 Internet Explorer 5.5 和更高版本存储的非动态代理设置并使用这些设置创建 WebProxy 实例。
GetDefaultProxy 方法不获取从 Internet Explorer 运行的脚本、从自动配置项或者从 DHCP 或 DNS 查找生成的任何动态设置。
但是这个API已经过时,所以现在我推荐的方法是:将Proxy属性设置为null:
http://msdn.microsoft.com/zh-cn/library/fze2ytx2(v=vs.80).aspx

3、使用IE代理,同时使用各种动态配置项

这个是比较简单的了,当然这种情况还是会包含两种小的情况:
(1)使用app.config中的配置:将Proxy属性设置为 WebProxy.DefaultWebProxy
(2)不使用app.config中的配置:将Proxy属性设置为 WebRequest.GetSystemWebProxy()
GetSystemWebProxy 方法读取当前用户的 Internet Explorer (IE) 代理设置。 此进程包括 IE 选项来自动检测代理设置,请使用自动配置脚本、手动代理服务器设置和高级手动代理服务器设置。

4、不使用任何代理

不使用任何代理的方法是:创建一个WebProxy类的新实例:
默认构造函数通过将 Address 属性设置为 null 来初始化 WebProxy 类的空实例。
Address 属性为 null 时,IsBypassed 方法返回 true,且 GetProxy 方法返回目标地址。
另外再来看看Address属性的说明:
Address 属性包含代理服务器的地址。 如果未启用自动代理检测并且未指定自动配置脚本,则 Address 属性与 BypassList 共同确定用于请求的代理。
当 Address 属性为 null 时,请求回避此代理并且直接连接到目标主机。
综上所述,也就是说,当使用无参构造函数创建一个新的WebProxy对象时(req.Proxy = new WebProxy();),这个请求会绕过所有代理服务器直接连接目标服务器。

5、其他

关于如何设置app.config/machine.config配置文件中的代理设置:
元素:http://msdn.microsoft.com/zh-cn/library/kd3cf2ex
元素:http://msdn.microsoft.com/zh-cn/library/sa91de1e(v=vs.100).aspx

文章引用自:
http://blog.csdn.net/wxc238351/article/details/54345251

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/151964.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • idea插件Tabnine激活码_在线激活

    (idea插件Tabnine激活码)这是一篇idea技术相关文章,由全栈君为大家提供,主要知识点是关于2021JetBrains全家桶永久激活码的内容https://javaforall.net/100143.htmlIntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,上面是详细链接哦~MLZPB5EL5Q-eyJsaWNlb…

    2022年3月21日
    615
  • docker(7)docker-compose容器集群编排「建议收藏」

    docker(7)docker-compose容器集群编排「建议收藏」前言实际工作中我们部署一个应用,一般不仅仅只有一个容器,可能会涉及到多个,比如用到数据库,中间件MQ,web前端和后端服务,等多个容器。我们如果一个个去启动应用,当项目非常多时,就很难记住了,所有

    2022年7月31日
    10
  • 设备驱动基础学习–platform driver简单实现「建议收藏」

    设备驱动基础学习–platform driver简单实现「建议收藏」设备驱动基础学习–platformdriver简单实现

    2022年7月4日
    22
  • 交换机的背板带宽计算方式

    交换机的背板带宽计算方式交换机的背板带宽 是交换机接口处理器或接口卡和数据总线间所能吞吐的最大数据量 背板带宽标志了交换机总的数据交换能力 单位为 Gbps 也叫交换带宽 一般的交换机的背板带宽从几 Gbps 到上百 Gbps 不等 一台交换机的背板带宽越高 所能处理数据的能力就越强 但同时设计成本也会越高 一般来讲 计算方法如下 1 线速的背板带宽考察交换机上所有端口能提供的总带宽 计

    2025年7月9日
    2
  • Flask 让jsonify返回的json串支持中文显示

    Flask 让jsonify返回的json串支持中文显示用flask时遇到了返回字符串支持中文显示的问题,在web端显示的是utf-8的编码,而不是中文,如下图。虽然不影响接口的读取,但是可读性太差,于是研究了一下怎么直接显示成中文。最后找到了解决方案如下,在配置中加入下面一行代码就OK了。app.config[‘JSON_AS_ASCII’]=Falsejson.dumps()解决同样的问题可以加入ensure_ascii=False参考资料:

    2022年5月23日
    33
  • java如何打印菱形_JAVA输出菱形

    java如何打印菱形_JAVA输出菱形菱形的打印方式,通过确定中间行,确定奇数然后做的处理,思路:上面部分通过确定打印数量为奇数,然后采用公式计算出奇数来,下面因为空格数量就是总行数减中间行数-1计算的,这样就可以计算出要打印的*的数量publicclassTestFile{ publicstaticvoidmain(String[]args){ //TODOAuto-generatedm…

    2022年9月29日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号