【问题标题】:How to retrieve proxy info using WebClient如何使用 WebClient 检索代理信息
【发布时间】:2014-11-17 16:31:45
【问题描述】:

我的应用通过客户代理服务器测试与网站的连接。

作为诊断的一部分,我想显示代理服务器返回的关于自身的信息,例如服务器 HTTP 标头的内容(例如:服务器:Squid/3.1.6)、代理协议(例如作为 HTML),...

如何检索代理服务器在其 HTTP 响应中返回的此类信息?

编辑:不幸的是,正如许多人所建议的那样,返回的响应标头包含很少的内容,并且没有关于代理的任何内容。我猜它们只是 Web 服务器返回并由代理转发的标头。我的下一个想法是向代理发出一个虚假的 CONNECT HTTP 请求,看看他会回复什么。或者是否有更深入的访问与代理的对话?

注意:平台要求:.NET3 max :-(

【问题讨论】:

    标签: c# .net visual-studio-2010


    【解决方案1】:

    WebClient.ResponseHeader 是我想你要找的。​​p>

    假设您使用的是代理,那么 WebClient 看到的只是来自代理的请求,所以这将为您提供标头。创建对象时您应该已经知道的代理协议...

    从上面的链接复制:

    // Obtain the WebHeaderCollection instance containing the header name/value pair from the response.
    WebHeaderCollection myWebHeaderCollection = myWebClient.ResponseHeaders;
    Console.WriteLine("\nDisplaying the response headers\n");
    // Loop through the ResponseHeaders and display the header name/value pairs. 
    for (int i=0; i < myWebHeaderCollection.Count; i++)             
        Console.WriteLine ("\t" + myWebHeaderCollection.GetKey(i) + " = " + myWebHeaderCollection.Get(i));
    

    【讨论】:

      【解决方案2】:

      如果您使用 WebClient 类 (http://msdn.microsoft.com/en-us/library/system.net.webclient_properties%28v=vs.110%29.aspx),您可以获取有关代理访问代理属性的所有信息。如果不是,您可以检查您的 Request 对象。

      【讨论】:

      • OP 不是询问代理属性,而是询问代理在 response 中返回的 HTTP 标头
      • 这就是为什么我告诉他检查 Request 对象,我们可以在其中找到有关请求的所有信息,包括 HTTP 标头。
      • Request 对象如何包含服务器返回的信息?
      • @IcaroCamelo OP 询问的是由中间(可能未知)代理添加到响应中的 响应标头,而不是请求标头。响应可能会通过许多代理,例如。服务器端的反向代理,或任何中间 ISP。他们每个人都可以添加自己的标题。
      【解决方案3】:

      您可以使用此代码显示来自here响应标头

      static void DownloadAndShowHeaders()
      {
          using (WebClient client = new WebClient())
          {
              try
              {
                  client.DownloadString("http://google.com");
                  foreach (string name in client.ResponseHeaders.Keys)
                  {
                      Console.WriteLine(name + "=" + client.ResponseHeaders[name]);
                  }
              }
              catch (WebException we)
              {
                  Console.WriteLine(we.Status);
              }
      
              Console.ReadLine();
          }
      }
      

      【讨论】:

        【解决方案4】:

        响应标头存储在WebClient.ResponseHeaders 属性中。此属性存储上次 WebClient 调用的标头。如果您在多次调用中重复使用同一个实例,则必须确保在每次调用后立即检索值。

        更好的选择是使用直接 HttpWebRequest 调用或(在 .NET 4+ 中)HttpClient,这样您就可以保留每个单独调用的响应以进行处理。

        ResponseHeaders 是一个 NameValueCollection,因此您可以按名称或通过 HttpResponseHeader 枚举引用特定标头,例如:

        var header=myClient.ResponseHeaders[HttpResponseHeader.Server];
        

        如果您不想,则不必遍历所有标题或键

        【讨论】:

        • 谢谢。不幸的是,返回的 Response 标头包含很少的内容,并且没有关于代理的任何内容。我猜它们只是 Web 服务器返回并由代理转发的标头。我的下一个想法是向代理发出一个虚假的 CONNECT HTTP 请求,然后查看他的回复。或者是否有更深入的访问与代理的对话?
        • 我不知道,但您必须使用 HttpClient 发送除 GET/POST 之外的动词。这还可以让您控制请求和响应的发送方式。
        • 很遗憾,出于部署原因,.NET4+ 不是一个选项:我们的客户将使用该应用程序进行快速的现场连接测试。我们不能对已安装的运行时做出任何假设。 .NET3 是我可以期待的最高版本,因为它是 Windows Vista+ 的一部分,希望大多数仍在使用 XP 的客户都安装了 .NET3。
        • 不需要这样的限制。 .NET Client profile 只有 40MB,您可以将其作为应用程序的一部分进行安装。无论如何,您可以直接使用 HttpWebRequest 来指定 HTTP 动词
        • 当您打电话给一位时间有限的客户时,他将在全球范围内要求他从工厂车间的一台计算机上为您运行连接测试,而他与计算机管理员几乎没有什么关系,通过企业 Internet 连接(不是您好的私人 DSL 线路),40MB 与“仅”无关;-)
        猜你喜欢
        • 2020-12-18
        • 1970-01-01
        • 2021-07-31
        • 1970-01-01
        • 1970-01-01
        • 2021-09-08
        • 2021-12-14
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多