繁体   English   中英

检查由WebClient代理设置的标头

[英]Inspect headers set by WebClient proxy

我正在通过一些免费的代理服务器执行请求,并且我想知道每个代理服务器设置的标头。 现在,我正在访问一个在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侦听器吗?

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

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

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

响应返回后,您可以首先尝试检查WebClient的client.ResponseHeaders 属性 如果它不包含与(pagethatprintsrequestheaders.com)报告匹配的标头,则它实际上是自定义或修改的实现。

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

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

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

如果代理将标头添加到请求中,则您的网络客户端将永远不会在请求中看到标头。

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

Web客户端只能看到它与代理之间的请求状态。 代理将创建一个新请求以发送到目标主机,并向其添加标题的那个请求。 它也是目标主机接收到的请求(这就是为什么当它回显标头时它可以看到代理添加的标头)

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

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

一种选择是使用主机将标头回送作为响应有效负载的一部分。
另一个办法是在代理服务器和目标主机之间使用某种工具检查那里的请求(例如,数据包嗅探器或诸如Fiddler之类的其他代理服务器,使您可以查看请求标头)。

如果代理位于您的网络之外,则很难在代理和目标主机之间切换(除非主机在您的控制之下)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM