c# - HttpWebRequest 返回 "(403) Forbidden"错误

标签 c#

我写了一个 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/

相关文章:

c# - 具有公共(public)(单实例)构造函数的单例

javascript - ASP.NET MVC - 显示单引号时 Razor 上的错误

c# - Unity 2D Mouse Zoom,但放大到鼠标点的位置

c# - 用压降控制遥控车

c# - 淡出一个窗口

c# - System.Text.Json:使用自动转换反序列化 JSON

c# - 从不同的线程关闭启动画面?

c# - 遍历数据 GridView 中的每一行

c# - 动态 SQL 查询导致 "Unclosed quotation mark"错误

c# - 替换可移植类库中的 SynchronizationContext.Send()