C# HttpWebRequest返回“;(403)禁止;错误

C# HttpWebRequest返回“;(403)禁止;错误,c#,C#,我编写了一个xml抓取程序来接收/解码网站上的xml文件。它通常工作正常,但总是返回错误: “远程服务器返回错误:(403)禁止。” 场地 我的代码是: CookieContainer cookies = new CookieContainer(); HttpWebRequest webRequest = (HttpWebRequest)HttpWebRequest.Create(Path); webRequest.Method = "GET"; webRequest.CookieContain

我编写了一个xml抓取程序来接收/解码网站上的xml文件。它通常工作正常,但总是返回错误:

“远程服务器返回错误:(403)禁止。”

场地

我的代码是:

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方法中抛出的。我怎样才能知道发生了什么事?

您的请求是通过代理服务器发送的吗?如果是,请在调用
GetResponse()
之前添加以下行

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

很可能您没有访问您试图访问的资源的权限。因此,您需要获得必要的凭据才能完成所需的操作。

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

这似乎确实有效。

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

服务器经常使用这种方法,试图防止像您这样编写站点脚本;o)

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

似乎向
用户代理
标题添加任何值都可以用于此站点。例如,我将其设置为“绝对不是屏幕刮板”,这似乎工作正常

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

互联网不是一个黑匣子


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

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

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

您使用过调试器吗。。?在您的第二行代码中,
webRequest
看起来像什么。。?执行
ReadToEnd()时,xml是什么样子的方法。。?看看这里的答案,答案是
88
upvows@MethodMan-根据最后一行,我认为代码没有走那么远。使用方法
GetResponse()
>requests xml>extension is xml>获取HTML时,它在第一次
时失败,您会喜欢它的>government@Igor不,这不是预期的。我也很困惑。但我可以在chrome浏览器的调试控制台中获得真正的xml文件。@MikeGoodwin。。。。是的,但我同意,这可能是罪魁祸首@ncite-看到我昨天写的这个答案了吗?它有着完全相同的问题,并且通过添加用户代理标题得到了修复。谢谢!Mike Goodwin和@Igor.It可能不是
用户代理
,我刚刚遇到了一个问题,结果是缺少
X-request-With
标题。