我编写了一个xml采集器,以接收/解码来自网站的xml文件。大多数情况下它都能正常工作,但总是返回错误:



用于网站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 中添加任何值似乎都适用于此站点。例如,我将其设置为“绝对不是屏幕抓取工具”,这似乎可以正常工作。

通常,遇到此类问题时,通常可以使用浏览器工具或Fiddler之类的代理来查看实际的HTTP请求和响应。正如斯科特·汉塞尔曼(Scott Hanselman)所说



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

关于c# - HttpWebRequest返回 "(403) Forbidden"错误,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38336562/

10-16 10:16