【问题标题】:Using C# WebClient with a Proxy - no request made to proxy server?将 C# WebClient 与代理一起使用 - 没有向代理服务器发出请求?
【发布时间】:2011-10-20 03:50:36
【问题描述】:

我们有一个后台操作(窗口服务),我们想通过代理服务器使用它。

基本上,我们正在这样做:

public WebClient GetWebClient(){
   var webClient = new WebClient();
   webClient.proxy = new WebProxy(Configuration.ProxyHost, Configuration.ProxyPort);

   // add a bunch of headers to the WebClient (sessionids, etc.)

   return webClient;
}

代理是我们使用FreeProxy 自己配置的代理。

我在我正在测试的机器上启用了日志记录,并且可以确认在 Firefox 中使用代理时正在向代理发出请求。

代理服务器不需要身份验证,除了 IP 必须在我们的办公室内(从 Firefox 的证据来看,我认为这不是问题)。

但是,在我们的后台进程中,当我使用 webclient 时,我似乎没有使用代理:

using(var wc = GetWebClient())
using(var s = wc.OpenRead("someurl"))
using(var sr = new StreamReader(s)){
    return sr.ReadToEnd();
}

我没有收到来自代理的错误,但似乎我们只是在没有它的情况下继续前进,即使已明确设置了代理。

信息似乎可以正常返回,只是不是通过我们的代理。

使用带有WebClient 的代理时,我有什么遗漏吗?

编辑:更多细节。如果我们禁用服务器上的代理服务,则会出现无法连接的异常。所以看起来网络客户端正在尝试访问代理,但流量实际上并没有流经代理。

Inner Exception: SocketException: A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond

【问题讨论】:

    标签: c# windows-services webclient proxies


    【解决方案1】:

    事实证明,FreeProxy 不接受 HTTPS 流量。

    我猜代理必须返回它可以路由的流量类型,如果不能,webclient什么也不做。

    改用 Burp 套件作为我们的代理,因为它可以接受 HTTPS。

    http://portswigger.net/burp/

    【讨论】:

      【解决方案2】:

      您要么必须配置 windows 以默认使用代理,要么在代码中手动设置代理,请参阅:http://msdn.microsoft.com/en-us/library/system.net.webclient.proxy(v=VS.100).aspx

      【讨论】:

      • 我是手动设置代理,如第一种方法sn -p所示。我在这里错过了什么吗?
      • 对不起,我完全忽略了这一点!休息后让我检查一下有没有问题
      【解决方案3】:

      据我所知,您正在正确使用 WebClient 类。我可以看到以下请求...

      using(var client = new WebClient())
      {
          client.Proxy = new WebProxy("localhost", 8888);
          Console.WriteLine(client.DownloadString("http://www.google.com"));
      }
      

      在我本地机器上运行的 Fiddler 中。现在,如果我关闭 Fiddler,我会收到 WebException:

      Unable to connect to the remote server
      

      内部 SocketException 为:

      No connection could be made because the target machine actively refused it 127.0.0.1:8888
      

      因此,话虽如此,我的猜测是您的代理正在按预期工作,但它只是没有记录传出的 HTTP 请求。

      【讨论】:

      • 我在测试时假设了同样的事情。但是,我可以指向一个我知道会为我的机器地址返回 403(禁止)的服务器,并且即使通过代理也可以确认 403 已返回给我。
      猜你喜欢
      • 2010-10-23
      • 2012-10-18
      • 1970-01-01
      • 2013-07-30
      • 1970-01-01
      • 1970-01-01
      • 2014-09-24
      • 2014-07-30
      • 1970-01-01
      相关资源
      最近更新 更多