我写了一个 xml 抓取器来接收/解码来自网站的 xml 文件。它大部分工作正常,但总是返回错误:
"The remote server returned an error: (403) Forbidden."
网站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 方法中抛出的。我怎样才能知道发生了什么?
最佳答案
可能是您的请求缺少服务器所需的 header 。我在浏览器中请求了该页面,使用 Fiddler 记录了确切的请求,然后删除了 User-Agent
header 并重新发出了请求。这导致了 403 响应。
这通常被服务器用来防止像您正在做的那样对他们的站点进行脚本编写;o)
在这种情况下,403 响应中的服务器 header 是“AkamaiGHost”,表示来自 Akamai 的某些云安全解决方案的边缘节点。也许用于防止机器人程序的 WAF 规则触发了 403。
似乎向 User-Agent
header 添加任何值都适用于此站点。例如,我将其设置为“definitely-not-a-screen-scraper”,这似乎工作正常。
一般来说,当您遇到此类问题时,使用浏览器工具或代理(如 Fiddler)查看实际的 HTTP 请求和响应通常会有所帮助。正如 Scott Hanselman 所说
The internet is not a black box
http://www.hanselman.com/blog/TheInternetIsNotABlackBoxLookInside.aspx
关于c# - HttpWebRequest 返回 "(403) Forbidden"错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38336562/