Не скачивается .pdf файл

Обычные картинки нормально скачиваются, а он битый получается. Вот ссылка на файл https://www.margroid.ru/upload/fitting.pdf

Вот это код:

string image = link;
string konec1 = image.Substring(image.LastIndexOf("."), image.Length - image.LastIndexOf("."));
if (!image.Contains("http"))
   image = host + image;

Directory.CreateDirectory($@"C:\Work\{sitename}\" + NA);

using (WebClient client = new WebClient())
{
   client.DownloadFileAsync(new Uri(image), $@"C:\Work\{sitename}\" + NA + @"\" + number_image + konec1);
}

string gg = $"/upload/staff/upload/staff/{sitename}/" + NA + "/" + number_image + konec1 + ";\r\n";
number_image++;
return gg;

введите сюда описание изображения


Ответы (1 шт):

Автор решения: VladD

Вы пользуетесь асинхронной функцией DownloadFileAsync, которая не выполняет до конца, а лишь инициирует загрузку. Сразу после этого ваш код выходит из блока using и уничтожает WebClient, который производит загрузку в фоновом режиме, вот файл и получается недогруженный.

Если для маленьких файлов ваш WebClient иногда успевает загрузить весь файл, то для больших происходят очевидные проблемы.

Возможные решения:

  1. Дождитесь окончания загрузки, подписавшись на DownloadFileCompleted, и только по приходу этого события уничтожайте client.
  2. Сделайте ваш метод асинхронным (async), воспользуйтесь более современной функцией DownloadFileTaskAsync: await client.DownloadFileTaskAsync(...);
  3. Если очень не хочется работать с асинхронными функциями, воспользуйтесь синхронным методом DownloadFile(...), но если вы в UI-потоке, приготовьтесь к подвисаниям.

Я бы рекомендовал альтернативу 2. Ещё можно перейти с давно устаревшего WebClient на современный HttpClient (он весь асинхронный), и использовать что-то наподобие

var sourceStream = await httpClient.GetStreamAsync(new Uri(image));
using (var targetStream = File.Create($@"C:\Work\ ..."))
    await sourceStream.CopyToAsync(targetStream);
→ Ссылка