HttpWebRequest 返回“(403) 禁止访问”错误

本文关键字:禁止 访问 错误 返回 HttpWebRequest | 更新日期: 2023-09-27 17:56:42

我写了一个xml抓取器来接收/解码来自网站的xml文件。它大部分工作正常,但它总是返回错误:

"远程服务器返回错误:(403) 禁止访问。"

对于站点 http://w1.weather.gov/xml/current_obs/KSRQ.xml

我的代码是:

CookieContainer cookies = new CookieContainer();
HttpWebRequest webRequest = (HttpWebRequest)HttpWebRequest.Create(Path);
webRequest.Method = "GET";
webRequest.CookieContainer = cookies;
using (HttpWebResponse webResponse = (HttpWebResponse)webRequest.GetResponse())
{
    using (StreamReader streamReader = new StreamReader(webResponse.GetResponseStream()))
    {
        string xml = streamReader.ReadToEnd();
        xmldoc.LoadXml(xml);
    }
}

例外是抛出 GetResponse 方法。我怎样才能知道发生了什么?

HttpWebRequest 返回“(403) 禁止访问”错误

可能是您的请求缺少服务器所需的标头。我在浏览器中请求了该页面,使用 Fiddler 记录了确切的请求,然后删除了 User-Agent 标头并重新发出请求。这导致了 403 响应。

服务器经常使用它来试图阻止像您一样编写其站点的脚本;o)

在这种情况下,403 响应中的服务器标头为"AkamaiGHost",表示来自 Akamai 的某些云安全解决方案的边缘节点。也许防止机器人的 WAF 规则正在触发 403。

似乎向User-Agent标题添加任何值都适用于此站点。例如,我将其设置为"绝对不是屏幕抓取器",这似乎工作正常。

通常,当您遇到此类问题时,使用浏览器工具或 Fiddler 等代理查看实际的 HTTP 请求和响应通常会有所帮助。正如斯科特·汉塞尔曼所说

互联网不是黑匣子

http://www.hanselman.com/blog/TheInternetIsNotABlackBoxLookInside.aspx

显然,该 URL 在浏览器中工作。它只是无法从代码中工作。 服务器似乎正在根据用户代理接受/拒绝请求,这可能是尝试阻止爬虫的一种非常基本的方法。

要通过,只需将 UserAgent 属性设置为它可以识别的内容,例如:

webRequest.UserAgent = @"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.106 Safari/537.36";

这似乎确实有效。

在我的特殊情况下,服务器不喜欢的不是UserAgent标头,而是Accept标头。

request.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8";

您可以使用开发工具的浏览器网络选项卡来查看正确的标头应该是什么。

您的请求是否通过代理服务器?如果是,请在GetResponse()呼叫之前添加以下行。

webRequest.Proxy.Credentials = System.Net.CredentialCache.DefaultCredentials;