WebClient:下载未完成:远程服务器返回错误:(403)禁止。

时间:2011-11-20 09:26:03

标签: c# winforms webclient

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

      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");

但它仍无效。

如果有人能帮助我,我们将非常感激。

提前致谢。

2 个答案:

答案 0 :(得分:5)

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

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

使用Fiddler查看下载管理器发送的请求与您的请求之间的区别,然后修改您的请求,直到它可行,这可能是值得的。

修改

我已经测试了您提供的网址,并通过添加以下内容让我在本地工作:

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)");

您需要提供“接受”标头,否则服务器不知道您的客户想要/将接受什么。这是我完整的anonimized示例应用程序(为简单起见使用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);
        }

答案 1 :(得分:1)

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

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

无论如何,您的用户代理也可能是一个问题,有些网站不允许使用未知用户代理的客户端,请尝试添加一个流行的Web浏览器,并查看是否可以下载该文件。

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

的完整列表