WebClient: загрузка не завершена: удаленный сервер возвратил ошибку: (403) запрещено. - PullRequest
1 голос
/ 20 ноября 2011

Я использую этот код для загрузки файла

      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 для загрузки в Free Download Manager, он работает

Я добавил эту строку

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

, но она все еще не работает.

Там будетБуду признателен, если кто-нибудь сможет мне помочь.

Заранее спасибо.

Ответы [ 2 ]

5 голосов
/ 20 ноября 2011

Похоже, что используемый вами менеджер загрузок может подделывать заголовки реферера, а ваша реализация - нет. Возможно, сервер ограничивает загрузку файла, который вы пытаетесь загрузить, чтобы его можно было загружать только в том случае, если для поля referer задано определенное значение (то есть сайт на сервере). Вы пытались:

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

Вам необходимо предоставить заголовок «Принять», иначе сервер не знает, что ваш клиент хочет / примет. Вот мой полный анонимный пример приложения (для простоты используется 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 голос
/ 20 ноября 2011

Ошибка 403 Forbidden обычно возвращается, если у пользователя нет разрешения на просмотр / загрузку определенного контента.

Вы упомянули, что он работает в Free Download Manager, но вы не упомянули, указали ли вы информацию аутентификации в Free Download Manager (да, вы можете сделать это).

В любом случае ваш пользовательский агент также может быть проблемой, некоторые веб-сайты не позволяют клиентам с неизвестным пользовательским агентом, попробуйте добавить 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 в интернете

...