尝试使用WebClient访问网站时,网站会切断连接

时间:2017-03-16 05:04:06

标签: c# .net http-headers webclient access

我在本地网络上有一个网站,我正在尝试为其编写一个小客户端。

我试图将WebClient用于此目的,但是,似乎网站以某种方式检测到它并且不允许继续切断连接,这导致WebException。

为了解决这个问题,我尝试添加如下标题:

        WebClient wc = new WebClient();
        wc.Headers["User-Agent"] = "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.2 (KHTML, like Gecko) Chrome/15.0.874.121 Safari/535.2";
        wc.Headers.Add("Accept", "text/html,application/xhtml+xml,application/xml");
        wc.Headers.Add("Accept-Encoding", "deflate, sdch, br");
        wc.Headers.Add("Accept-Charset", "ISO-8859-1");
        wc.Headers.Add("Accept-Language", "en-us;q=0.7,en;q=0.3");

然而,该网站仍然删除了连接,我设法注意到并非所有标题都已发送,然后,我试图覆盖WebRequest:

    public class MyWebClient : WebClient
    {
        protected override WebRequest GetWebRequest(Uri address)
        {
            WebRequest request = base.GetWebRequest(address);
            var castRequest = request as HttpWebRequest;

            if (castRequest != null)
            {
                castRequest.KeepAlive = true;
                castRequest.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8";
                castRequest.UserAgent = "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.2 (KHTML, like Gecko) Chrome/15.0.874.121 Safari/535.2";
                castRequest.Headers.Add("Accept-Encoding", "deflate, sdch, br");
                castRequest.Headers.Add("Accept-Charset", "ISO-8859-1");
                castRequest.Headers.Add("Accept-Language", "en-US,en;q=0.8");
            }

            return request;
        }
    }

这设法发送了所有标题,但是,我仍然无法访问该网站。

我可以使用Firefox或Chrome之类的任何浏览器访问网站,我可以从中复制标题甚至WebBrowser控件,我也可以使用WebClient访问其他网站而不会出现任何问题。

为什么我无法使用WebClient访问此类网站?

还有什么可以使WebClient请求看起来更像网站的浏览器吗?

1 个答案:

答案 0 :(得分:0)

我发现我正朝着错误的方向前进。

有问题的网站似乎不支持默认的SecurityProtocol,因此我必须启用TLS12:

        ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;

由于某种原因,它导致了我正在解析的另一个本地网站的相同问题,我通过启用所有TLS版本解决了这个问题:

        ServicePointManager.SecurityProtocol = 
                                   SecurityProtocolType.Tls
                                 | SecurityProtocolType.Tls11
                                 | SecurityProtocolType.Tls12;