检查WebClient代理设置的标头

时间:2014-06-19 12:08:13

标签: c# asp.net

我正在通过某个free proxy servers执行请求,我想知道每个代理服务器设置的标头。现在我正在访问一个在html正文中打印出结果的页面。

using(WebClient client = new WebClient())
{
    WebProxy wp = new WebProxy("proxy url");
    client.Proxy = wp;
    string str = client
                  .DownloadString("http://www.pagethatprintsrequestheaders.com");
}

WebClient不会显示已修改的标题,但页面会打印正确的标题。是否有任何方法可以找到代理设置的标题而无需访问打印它们的页面,就像在我的示例中一样?我是否必须创建自己的http侦听器?

2 个答案:

答案 0 :(得分:3)

当代理服务器设置自己的标头时,它实际上是在执行自己的Web请求。它甚至可以隐藏或覆盖您使用WebProxy设置的某些标题。

因此,只有目标页面(pagethatprintsrequestheaders.com)可以可靠地查看代理设置的标头。无法保证代理服务器会将发送给目标的标头发回给您。

换句话说,它实际上取决于代理服务器的实现。如果您使用的代理服务器基于Apache的ProxyPass,您可能会看到标题已设置!如果它是自定义实现,那么您可能看不到它。

您可以在回复之后首先尝试检查WebClient的client.ResponseHeaders property。如果这不包含匹配(pagethatprintsrequestheaders.com)报告的标题,那么它确实是自定义或修改的实现。

然后,您可以创建自己的代理服务器,但这涉及更多。您可能会启动一个EC2实例,在其上安装Squid / TinyProxy / YourCustomProxy并在WebProxy调用中使用它。

您可能还想修改问题并解释为什么要阅读标题。您的总体目标可能有解决方案,根本不需要读取标题,但可以通过其他方式完成。

答案 1 :(得分:2)

看起来您是通过代理发送来自您的WebClient的请求,也是主机在www.pagethatprintsrequestheaders.com上收到的请求。

如果代理正在向请求添加标头,那么您的webclient将永远不会在请求中看到它们。

        webclient             proxys request 
         request            with headers added
client -----------> proxy ----------------------> destination host

webclient只能看到它与代理之间的请求状态。代理将创建一个发送到目标主机的新请求,以及添加标头的请求。它也是目标主机收到的请求(这就是为什么当它回传标题时它可以看到代理添加的那些)

当响应返回时,标头由主机设置。代理可能会在响应中添加一些标头,但即使这样做,它们也不一定是它添加到请求中的相同标头。

            response                      response
        (forwarded by proxy)        (headers set by host)
client <------------------- proxy <------------------------- destination host

使用作为响应有效负载的一部分回显标头的主机是一种选择 另一种方法是在代理和目标主机之间使用某些东西来检查那里的请求(例如数据包嗅探器或其他代理,如Fiddler,可以让你看到请求头)。

如果代理服务器位于您的网络之外,则很难在代理服务器和目标主机之间进行访问(除非主机在您的控制之下)。