【问题标题】:WebClient : Download Not Complete: The remote server returned an error: (403) Forbidden.WebClient:下载未完成:远程服务器返回错误:(403)禁止。
【发布时间】:2011-11-20 09:26:02
【问题描述】:

我正在使用此代码下载文件

      private WebClient client;    
        client = new WebClient();      
        if (isBusy)
        {
            client.CancelAsync();
            isBusy = false;
            this.downloadButton.Text = "Download";
        }
        else
        {
            try {
                Uri uri = new Uri(urlTextBox.Text);
                this.downloadProgressBar.Value = 0;
                client.Headers.Add("User-Agent: Other");
                client.DownloadFileAsync(uri, "test.csv.zip");         
                this.downloadButton.Text = "Cancel";
                isBusy = true;
            }
            catch (UriFormatException ex) {
                MessageBox.Show(ex.Message);
            }
        }

但我得到一个错误,错误是

  Download Not Complete: The remote server returned an error: (403) Forbidden.

我不知道为什么会来。

但是当我在免费下载管理器中使用 uri 进行下载时,它的工作原理

我添加了这一行

             client.Headers.Add("User-Agent: Other");

但它仍然无法正常工作。

如果有人可以帮助我,将不胜感激。

提前致谢。

【问题讨论】:

  • 这看起来像是特定站点的问题,而不是 C# 的问题。可以从其他网站下载吗?
  • 你有没有通过 fiddler 运行这两个请求(工作 vs 不工作),看看有什么不同?
  • 我可以从网站下载文件并通过下载管理器购买而不是通过此代码
  • 如果你想看看有什么不同,我重复一遍:使用 fiddler。这需要大约 1 分钟来比较

标签: c# winforms webclient


【解决方案1】:

听起来您使用的免费下载管理器可能会欺骗引荐来源标头,而您的实现却不是。如果引用字段设置为特定值(即服务器上的站点),服务器可能会将您尝试下载的文件的下载限制为可下载。您是否尝试过:

client.Headers.Add("referer", uri);

可能值得使用Fiddler 来查看下载管理器发送的请求与您的请求之间的差异,然后修改您的请求直到它正常工作。

编辑

我已经测试了您提供的 URL,并通过添加以下内容使其在本地运行:

client.Headers.Add("Accept: text/html, application/xhtml+xml, */*");
client.Headers.Add("User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0)");

您需要提供“Accept”标头,否则服务器不知道您的客户端想要/将接受什么。这是我完整的匿名示例应用程序(为简单起见,使用 Sleep()):

        string url = "http://..."; // Change this to the full url of the file you want to download 
        string filename = "downloadedfile.zip"; // Change this to the filename you want to save it as locally.
        WebClient client = new WebClient(); 

        try 
        {
            Uri uri = new Uri(url);
            client.Headers.Add("Accept: text/html, application/xhtml+xml, */*");
            client.Headers.Add("User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0)");
            client.DownloadFileAsync(uri, filename);

            while (client.IsBusy)
            {
                System.Threading.Thread.Sleep(1000);
            }
        }
        catch (UriFormatException ex) 
        {
            Console.WriteLine(ex.Message);
        }

【讨论】:

    【解决方案2】:

    如果用户没有查看/下载特定内容的权限,通常会返回 403 Forbidden 错误。

    您提到它在免费下载管理器中工作,但您没有提及您是否在免费下载管理器中提供了身份验证信息(是的,您可以这样做)。

    反正你的user-agent也可能有问题,有些网站不允许使用未知user-agent的客户端,尝试添加流行的网络浏览器的auseragent,看看是否可以下载文件。

    IE 10.6 Mozilla/5.0 (compatible; MSIE 10.6; Windows NT 6.1; Trident/5.0; InfoPath.2; SLCC1; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; .NET CLR 2.0.50727) 3gpp-gba UNTRUSTED/1.0

    尝试这一行将上述 IE 10.6 用户代理添加到您的应用程序

     client.Headers.Add("User-Agent: Mozilla/5.0 (compatible; MSIE 10.6; Windows NT 6.1; Trident/5.0; InfoPath.2; SLCC1; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; .NET CLR 2.0.50727) 3gpp-gba UNTRUSTED/1.0");
    

    你可以找到useragent strings on the internet的完整列表

    【讨论】:

    • 你删除了这行client.Headers.Add("User-Agent: Other");
    • 尝试使用另一个用户代理字符串,如Mozilla/5.0 (Windows NT 6.1; WOW64; rv:6.0a2) Gecko/20110613 Firefox/6.0a2,即使它不起作用,您也可以使用 fiddler 比较免费下载管理器和您自己的应用程序之间的请求,看看有什么不同和正确它,您也可以使用这些标题信息更新您的问题,以便有人可以提供帮助
    • 能不能把免费下载管理器和自己应用的Http头数据贴出来,可以用Fiddler
    猜你喜欢
    • 1970-01-01
    • 2019-08-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多