我在本地网络上有一个网站,我正在尝试为其编写一个小客户端。
我试图将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请求看起来更像网站的浏览器吗?
答案 0 :(得分:0)
我发现我正朝着错误的方向前进。
有问题的网站似乎不支持默认的SecurityProtocol,因此我必须启用TLS12:
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
由于某种原因,它导致了我正在解析的另一个本地网站的相同问题,我通过启用所有TLS版本解决了这个问题:
ServicePointManager.SecurityProtocol =
SecurityProtocolType.Tls
| SecurityProtocolType.Tls11
| SecurityProtocolType.Tls12;