.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)
上一篇 2022年6月21日 上午10:00
下一篇 2022年6月21日 上午10:00


相关推荐

  • 隐式转换函数_隐函数可以转化为显函数

    隐式转换函数_隐函数可以转化为显函数隐式转换函数是以implicit关键字声明的带有单个参数的函数。这种函数将会自动应用,将值从一种类型转换为另一种类型objectDemo1Main{defmain(args:Array[String]):Unit={valnum:Int=f1(3.5);valnum1:Int=3.5;print(num)}implic…

    2022年8月31日
    4
  • Java中重载与重写的特点和区别[通俗易懂]

    Java中重载与重写的特点和区别[通俗易懂]一、重载(overload)重载:发生在Java的同一个类里面,通过定义相同的方法,定义不同的参数列表来区分开这些相同的方法,参数列表的不同可以是参数的类型、参数的个数和参数的顺序。当我们调用这些方法的时候通过传入参数的不同,在运行时Java虚拟机会自行调用不同的方法来进行处理。由于Java的修饰符都可以访问同一个类里面的方法,所以方法的重载与方法的修饰符无关;Java的返回值不能区别这些方法,因为返回值是在运行后才体现出来的,而两个参数列表相同仅仅是返回值相同的方法在Java编译时就会报错,虚拟机在运行

    2022年7月8日
    26
  • vim命令下显示行号[通俗易懂]

    vim默认不显示行号如何使vim命令显示行号?显示当前行行号在vim的命令模式下,在光标停留处,退出命令模式,然后输入:nu,即可显示当前这行的号码显示所有行号如果要显示该文件的所有行号,则需要在vim的命令模式下,输入:setnu,则可以显示该文件的所有行号取消所有行号如果要显示该文件的所有行号,则需要在vim的命令模式下输入,在光标停留处,退出命令模式,然后输入:setnonu,即可显示当前这行的号码这样的设置方法只能维持在,当前vim打开的文件…

    2022年4月11日
    119
  • 颠覆级浏览器自动化:n8n-nodes-puppeteer全方位技术指南

    颠覆级浏览器自动化:n8n-nodes-puppeteer全方位技术指南

    2026年3月12日
    2
  • linux 查看目录大小_shell判断文件大小

    linux 查看目录大小_shell判断文件大小du[-abcDhHklmsSx][-L][-X][–block-size][–exclude=][–max-depth=][–help][–version][目录或文件]常用参数:-a或-all为每个指定文件显示磁盘使用情况,或者为目录中每个文件显示各自磁盘使用情况。-b或-bytes显示目录或文件大小时,以byte为单位。-c或–tota…

    2022年10月12日
    3
  • finalize方法_final与finalize区别

    finalize方法_final与finalize区别当对象没有引用指向时,虚拟机会按照一定的垃圾回收机制算法来调用finalize方法将该对象回收,并不是只要没有引用对象就会被回收。因此,可以调用System.gc()方法来主动调用垃圾回收机制,但也并不能保证一定能成功。在调用时,程序并不会阻塞在此处,而是会继续向下执行。默认的object类中的finalize方法是不作其余处理的。可以重写finalize方法来实现自己想要的资源释放操作,比如数据库连接等。…

    2026年1月25日
    6

发表回复

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

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