检查WebClient代理设置的报头

本文关键字:报头 设置 代理 WebClient 检查 | 更新日期: 2023-09-27 18:09:14

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

检查WebClient代理设置的报头

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

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

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

您可以先尝试检查WebClient的client.ResponseHeaders属性后,您的响应回来。如果它不包含与(pagethatprintsrequestheaders.com)报告的内容匹配的头,那么它确实是一个自定义或修改的实现。

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

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

它看起来像是你从你的WebClient发送一个请求,通过代理和它的主机接收到www.pagethatprintsrequestheaders.com。

如果代理在请求中添加了报头,你的web客户端将永远不会在它的请求中看到它们。

        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这样的代理,让你看到请求头)。

如果代理不在您的网络中,那么在代理和目标主机之间通信将会很困难(除非主机在您的控制之下)。