HttpWebRequest返回“(403)Forbidden”错误

时间:2016-07-12 18:39:03

标签: c#

我写了一个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方法。我怎样才能知道发生了什么?

5 个答案:

答案 0 :(得分:15)

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

这经常被服务器用来试图像你一样阻止他们网站的脚本; o)

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

似乎向User-Agent标头添加任何值都适用于此网站。例如,我将它设置为“绝对不是一个屏幕刮板”,这似乎工作正常。

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

  

互联网不是黑匣子

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

答案 1 :(得分:12)

显然,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";

这确实有用。

答案 2 :(得分:1)

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

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

答案 3 :(得分:1)

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

QLineEdit

您可以使用开发工具的浏览器网络标签查看正确的标题。

答案 4 :(得分:0)

您很可能无权访问您尝试访问的资源。因此,您需要获取必要的凭据才能完成所需的操作。