企业上网一般都是通过网关服务器,部分非自动的代理服务器需要手工设置(就像IE需要在连接-局域网设置-代理器中的那样),前段为企业开发了一个需要远程访问HTTP服务器的应用,发现在手动代理的网络环境下,会在运行时WebRequest试图通过GetResponse获取Response对象时抛出:error: 远程服务器返回错误: (407) 需要代理身份验证。   的错误,其实就是因为网络代理服务器验证失败被拒绝的缘故。
前段碰到这个问题,苦于自己没有这样的网络环境,最近正好在客户单位干活,就是用了代理服务器,所以就花了一会儿时间搞出来了,其实很简单:
1.获取IE当前缺省的代理服务器信息(物理上其实存储在HKEY_CURRENT_USER/Software/Microsoft/Windows/CurrentVersion/Internet Settings/的ProxyEnable和ProxyServer),地址和端口号可以获取,但用户名和密码还是必须通过设置来获取
2.设置WebRequest的Proxy属性,绑定到有效的Proxy对象
我自己封装了一个方法,无论是直接连接还是通过代理服务器都可以自适应:
        public static void ProxySetting(WebRequest request)
        {
            WebProxy proxy = WebProxy.GetDefaultProxy();//获取IE缺省设置
     //如果缺省设置为空,则有可能是根本不需要代理服务器,如果此时配置文件中也未配置则认为不需Proxy
     if (proxy.Address == null && Sys.ProxyAddress != null && Sys.ProxyAddress != "")
                proxy.Address = new Uri(Sys.ProxyAddress);//按配置文件创建Proxy 地置
            if (proxy.Address != null)//如果地址为空,则不需要代理服务器
            {
                proxy.Credentials = new NetworkCredential(Sys.ProxyUser, Sys.ProxyKey);//从配置封装参数中创建
                request.Proxy = proxy;//赋予 request.Proxy
            }
        }

调用:
                request = (HttpWebRequest)WebRequest.Create(http://abc.com/def.xml);
                ProxySetting(request);//加在获取响应前
                request.GetResponse();
配置文件可能如下,读回后被Sys封装:
    <add key="ProxyAddress" value="" />
    <add key="ProxyUser" value="msuser" />
    <add key="ProxyKey" value="hello" />

OK了,现在你的程序就可以穿透设有代理服务器的局域网了

另外,如果需要用到类似XmlDocument直接加载远程XML文件的时间也会出现这样的问题,解决办法也很简单,多写一个方法改用WebRequest获取远程XML,再将Load方法改为LoadXml的装入String就可以了,如下:
       public static XmlDocument loadXMLDocument(string FileNameOrUrl)
        {
            XmlDocument doc = null;
            try
            {
                doc = new XmlDocument();
               // doc.Load( FileNameOrUrl);
                doc.LoadXml(GetWeb(FileNameOrUrl));//改为由WebRequest取回后载入XMLString
            }
            catch (Exception e)
            {
                System.Windows.Forms.MessageBox.Show(e.Message);
                Pub.logError(e);
                doc = null;
            }
            return doc;
        }

public static string GetWeb(string Url)
         {
              HttpWebRequest request ;
              HttpWebResponse response=null;
              StreamReader htmlStream =null;
              Stream stream=null;
              string html="";
              int i=0;
              do
              {
                   request=(HttpWebRequest )WebRequest.Create(Url);

ProxySetting(request);//检查代理设置

try
                   {
                       response = (HttpWebResponse)request.GetResponse();
                       break;
                   }
                   catch
                   {
                       request=null;
                   }
              }
              while(i++ <3);
              if (response==null) return "";
              if (request.HaveResponse)
              {

try
                   {
                       stream = response.GetResponseStream();
                       htmlStream = new StreamReader(stream,System.Text.Encoding.Default,true);
                       html=htmlStream.ReadToEnd();
                   }
                   catch
                   {}
                   finally
                   {
                       response.Close();
                       htmlStream.Close();
                       stream.Close();
                   }
              }
              return html;
         }

WebRequest设置代理相关推荐

  1. HttpHelps类,用来实现Http访问,Post或者Get方式的,直接访问,带Cookie的,带证书的等方式,可以设置代理...

    原文地址:http://blog.csdn.net/cdefg198/article/details/8315438 万能框架:http://www.sufeinet.com/forum.php?mo ...

  2. C# 使用GET和POST(v1签名方式)以及SDK的方式调用腾讯云人像动漫化接口,包含设置代理

    声明:此内容仅供学习交流使用,不用于商业用途,如果涉及侵权,联系作者删除. 最近在调用腾讯云的人像动漫化接口,感觉挺好玩的,自己去看文档写了一下,遇到了各种问题,最后都解决了 ,遇到最多的就是签名错误 ...

  3. devServer proxy跨域 设置代理 proxy

    概念 什么是同源策略 同源策略是一种约定,它是浏览器最核心也最基本的安全功能,如果缺少了同源策略,则浏览器的正常功能可能都会受到影响.可以说Web是构建在同源策略基础之上的,浏览器只是针对同源策略的一 ...

  4. linux 设置代理 安装jdk mysql tomcat redis hadoop

    1.修改linux用户名和密码 前提进入root用户   原用户名 XX,改成用户名 YY         执行 usermod -l YY XX   修改用户 YY 的密码,如果你在root权限下 ...

  5. 用iframe设置代理解决ajax跨域请求问题

    用iframe设置代理解决ajax跨域请求问题 参考文章: (1)用iframe设置代理解决ajax跨域请求问题 (2)https://www.cnblogs.com/ranzige/p/370965 ...

  6. Linux中为wget命令设置代理

    方法1:使用命令参数-e wget本身没有专门设置代理的命令行参数,但是有一个"-e"参数,可以在命令行上指定一个原本出现在".wgetrc"中的设置.于是可以 ...

  7. DNS隧道之DNS2TCP实现——dns2tcpc必须带server IP才可以,此外ssh可以穿过墙的,设置代理上网...

    我自己的命令: server端: dns2tcpd -F -d 1 -f ./dns2tcpd.conf 输出: 09:08:59 : Debug options.c:97 Add resource ...

  8. npm获取配置,设置代理

    npm获取配置有6种方式,优先级由高到底. 命令行参数. --proxy http://server:port即将proxy的值设为http://server:port. 环境变量. 以npm_con ...

  9. linux下设置代理

    由于我们实验室有自己的代理.所以想用代理,省些money.于是就开始学习怎么设置代理. 先是在网上搜了好些方法.但是怎么都成功不了.最后成功了以后,才发现,原来是网上提供的命令行的大小写有误,而且还少 ...

最新文章

  1. PowerDesigner12.5 下载、汉化及破解
  2. HoloLens开发入门
  3. javascript获取表单值的7种方式
  4. 十一假期朋友圈鄙视链,你在第几层?
  5. Raid技术精简总结
  6. 计算机不觉晓,人工智能知多少
  7. linux登录显示 Error in service module错误
  8. vcpkg编译库位数总结
  9. react获取鼠标位置_JavaScript 获取鼠标点击位置坐标
  10. Spell Checker
  11. PHP实现输入地址,获取当前位置的经纬度,$lng和$lat即为经纬度的返回值
  12. matlab求解常微分方程组——dsolve与ode45
  13. js实现60秒倒计时
  14. 跨考计算机 经验,跨考计算机成功的“重要”经验_跨考网
  15. 我的世界服务器如何修改天气,我的世界怎么切换天气 原来这么简单
  16. 移动端名片识别SDK
  17. 计算机应用 期刊 怎么样,《计算机应用研究》怎么样?投稿好中吗?
  18. PDF编辑/PDF浏览/PDF打印:PDFPrinting.NET Crack
  19. 微信公众号事件推送(点击推送图文)
  20. 冷启动、微创新、产品思维,一家AI公司孵化输入法的跋涉之路

热门文章

  1. PLC滑动平均值滤波(SMART 200梯形图篇)
  2. 1688商品详情api接口
  3. 降维算法总结(超全!附代码)
  4. C语言初阶-C语言中static的用法
  5. Unity中的万向节死锁
  6. 关于STM32内部温度传感器的算式话题
  7. Hive表分区查询show partitions tablename
  8. data.length提示undefined
  9. 【Linux】WARNING: The script locust is installed in ‘/home/xxx/bin‘ which is not on PATH.
  10. 【网络】OSI七层模型