【问题标题】:WebClient 403 ForbiddenWebClient 403 禁止
【发布时间】:2011-03-17 08:52:30
【问题描述】:

我可以在 IE 中手动下载这个。

http://scholar.google.com/scholar.ris?q=info:j8ymU9rzMsEJ:scholar.google.com/&output=citation&hl=zh-CN&as_sdt=2000&oe=GB&ct=citation&cd=0

但是,使用跟随代码

WebClient client = new WebClient();
client.DownloadFile(address, filename);

显示异常: 403禁止

怎么了? 我该怎么做?

其他

http://scholar.google.com/scholar.ris?q=info:sskrpr5jlLwJ:scholar.google.com/&output=citation&hl=zh-CN&as_sdt=2000&oe=GB&ct=citation&cd=1

【问题讨论】:

  • 我在 chrome 中确实有 403 Forbidden,它可能是 IE 兑现你的 ID 和密码
  • @volody :在代码里怎么办?

标签: c# webclient


【解决方案1】:

在下载之前添加一个简单的行:

string url = ... 
string fileName = ...

WebClient wb = new WebClient();
wb.Headers.Add("User-Agent: Other");   //that is the simple line!
wb.DownloadFile(url, fileName);

就是这样。

【讨论】:

  • +1 - 我曾怀疑过这一点,但只是作为一种理论。令人难以置信的是,他们在没有用户代理的情况下阻止了请求。想想就很聪明。
  • 我的 .net WebClient 突然开始从使用以下 user-agent 设置的 https 站点收到 403 禁止错误:Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; .NET CLR 1.0.3705;)。用Other 替换它可以解决问题。有人可以告诉我为什么吗?
  • 谢谢,我做了一个简单的 SteamDB 提取器来为我获取游戏的游戏横幅图像和 appid 信息,即使没有“User-Agent”行,它也一直有效,但最近我猜它了已更改为阻止非用户代理请求并不断收到 403,但这解决了我的问题。
【解决方案2】:

403 也可能是由 TLS 问题引起的。要进行验证,您应该检查 WebException.Response 对象的文本。

     catch (WebException ex)
     {
        if (ex.Response != null)
        {
           var response = ex.Response;
           var dataStream = response.GetResponseStream();
           var reader = new StreamReader(dataStream);
           var details = reader.ReadToEnd();
        }
     }

如果是 TLS,请尝试将其添加到您的代码中以强制 TLS1.2。

对于.net4:

ServicePointManager.SecurityProtocol = (SecurityProtocolType)3072;

对于 .net4.5 或更高版本:

ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;

【讨论】:

  • 经过更多的调查和反复试验,发现 URL 不是问题,就好像我把它们颠倒了一样,然后它起作用了,而另一个失败了。我认为这可能与服务器节流有关,因此在请求之间尝试了 system.thread.sleep 但这没有帮助。所以我最终将标题添加到循环中,并且在每次迭代之间清除标题并重新添加它们,并惊讶地发现一切都按预期正常工作。所以不知道为什么这会导致问题,并且只在几个网站上,但似乎有解决方案。
  • 这个“ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;”为我工作。
【解决方案3】:

我在尝试从 SharePoint 网站 url 下载图像时遇到了这个问题。在我的情况下,将 user-agent 设置为 Other 或在标题中留空是不够的,我必须将 user-agent 设置如下:

client.Headers.Add("user-agent", " Mozilla/5.0 (Windows NT 6.1; WOW64; rv:25.0) Gecko/20100101 Firefox/25.0");

该解决方案来自this answer。

【讨论】:

    【解决方案4】:

    您需要在调用 DownloadFile 方法之前设置适当的 http 标头。

    WebClient webClient = new WebClient();
    webClient.Headers.Add("???", "???");
    webClient.Headers.Add("???", "???");
    webClient.Headers.Add("???", "???");
    webClient.DownloadFile(address, filename);
    

    用正确的值代替这些问号可能会很棘手。您将需要下载 Fiddler 或其他一些程序或网络浏览器扩展程序,以显示您的网络浏览器正在向 Google 发送哪些 http 标头,并基本上在您的程序中复制相同的请求。

    【讨论】:

    【解决方案5】:

    这就是发生在我身上的事:

    我试图下载一个(公共).xls 文件(通过 DownloadFile 方法),该文件可以从所有浏览器轻松下载。

    在尝试了所有答案(但没有运气)之后,我终于打开了堆栈并发现了一些奇怪的东西(参考屏幕截图)。

    虽然文件是通过浏览器中的 http 下载的,但通过 DownloadFile 方法给出 403 错误。

    最后,我只是将 URL 从 http://something 更改为 https://something 并且效果很好。

    希望这会有所帮助!

    【讨论】:

      【解决方案6】:

      我在 IE 中得到 403,我猜你需要登录才能检索资源。 您的浏览器可能缓存了凭据,但您的应用并非旨在让您登录。或者您是否在浏览器中登录了 Google - 尝试注销并查看您是否仍有访问权限....

      【讨论】:

      【解决方案7】:

      我在尝试下载 Amazon 3S 网址上的文件时遇到了同样的问题。我在这里写了一篇博客: http://blog.cdeutsch.com/2010/11/net-webclient-403-forbidden-error.html

      我使用的最终解决方案在这里找到: GETting a URL with an url-encoded slash

      【讨论】:

        【解决方案8】:

        为我解决这个问题的关键是通过代码执行一次请求,第二次在浏览器中执行请求,使用 Fiddler 记录两个请求并确保标头匹配。

        我最终不得不为以下内容添加标题:

        • 接受
        • 接受编码
        • 接受语言
        • 用户代理
        • 升级不安全请求

        我希望这对未来的人们有所帮助。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2020-05-11
          • 2013-11-28
          • 1970-01-01
          • 2013-11-12
          • 2021-09-23
          • 2015-11-18
          • 2019-08-24
          • 2013-02-09
          相关资源
          最近更新 更多