Почему я получаю исключение при использовании WebClient.DownloadData для URL-адреса?

У меня есть 2 адреса:

https://static.summitracing.com/global/images/prod/xlarge/cse-5160_xl.jpg http://www.americanbassusa.com/Subwoofers/DX-Series-Images/DX/DX-front.jpg

Оба загружают соответствующие изображения правильно при открытии в Chrome, но при использовании следующего консольного приложения для их загрузки с помощью WebClient.DownloadData (String), второй URL вызывает System.Net.WebException.

Может ли кто-нибудь объяснить мне, почему это происходит?

class Program
{
    static void Main(string[] args)
    {
        const string WorkingUrl = "https://static.summitracing.com/global/images/prod/xlarge/cse-5160_xl.jpg";
        const string NonWorkingUrl = "http://www.americanbassusa.com/Subwoofers/DX-Series-Images/DX/DX-front.jpg";

        try
        {
            using (var client = new WebClient())
            {
                byte[] fileData = client.DownloadData(NonWorkingUrl);
            }
        }
        catch (Exception e)
        {
            Console.WriteLine(e);
        }

        Console.ReadLine();
    }
}

Подробная информация об исключении:

System.Net.WebException: The remote server returned an error: (400) Bad Request.
   at System.Net.WebClient.DownloadDataInternal(Uri address, WebRequest& request)
   at System.Net.WebClient.DownloadData(Uri address)
   at System.Net.WebClient.DownloadData(String address)
   at ConsoleApp4.Program.Main(String[] args) in C:\\Users\\davidandrewpowell\\source\\repos\\ConsoleApp4\\ConsoleApp4\\Program.cs:line 17

person Dangerous    schedule 19.04.2019    source источник
comment
Вставьте сведения об исключении в свой вопрос, WebException может быть любым   -  person Patrick Hollweck    schedule 19.04.2019
comment
Что же на самом деле сообщение об ошибке внутри исключения?   -  person Caius Jard    schedule 19.04.2019
comment
Извините, я добавил сообщение об исключении к вопросу.   -  person Dangerous    schedule 19.04.2019
comment
Число 400 означает, что серверное программное обеспечение сочло ваш запрос недействительным. Это зависит от серверного программного обеспечения, поэтому каждый сайт индивидуален. Может быть, в вашем запросе отсутствуют заголовки или неверная строка пользовательского агента, может быть, это что-то еще, кто знает?   -  person gunr2171    schedule 19.04.2019
comment
Возможно, вы захотите использовать DownloadFile, а не DownloadData.   -  person gunr2171    schedule 19.04.2019
comment
Спасибо, Кайус Джард. Это хороший совет. Я попробую это.   -  person Dangerous    schedule 19.04.2019


Ответы (1)


Этот конкретный сервер хочет строку агента пользователя, которая указывает, что браузер используется. Это работает:

    using (var client = new System.Net.WebClient())
        {
             client.Headers.Add(System.Net.HttpRequestHeader.UserAgent, "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.140 Safari/537.36 Edge/17.17134");
             client.DownloadFile(NonWorkingUrl, "c:\\temp\\a");
        }
    }

Нет особой причины, по которой я использовал файл загрузки - просто играю с разными вещами. Если вам нужен массив байтов в вашем приложении, обязательно используйте downloaddata :)

person Caius Jard    schedule 19.04.2019
comment
Замечательно. Спасибо за вашу помощь. - person Dangerous; 19.04.2019