2016-01-26 2 views
1

Я хочу загрузить .torrent-файл из дистрибутива Linux, но по какой-то причине окончательный файл, загруженный из моего приложения, отличается от загруженного вручную. Тот, который загружает мои приложения, имеет 31 КБ, и это недопустимый .torrent-файл, тогда как правый (при загрузке вручную) имеет 41 КБ, и он действителен.WebClient не скачивает нужный файл с поставленного URL

URL-адрес из файла я хочу, чтобы загрузить http://torcache.net/torrent/C348CBCA08288AE07A97DD641C5D09EE25299FAC.torrent

Почему это происходит и как я могу скачать тот же файл (действительный один, с 41Kb)?

Спасибо.


C# код из метода, который загружает файл выше:

 string sLinkTorCache = @"http://torcache.net/torrent/C348CBCA08288AE07A97DD641C5D09EE25299FAC.torrent"; 
     using (System.Net.WebClient wc = new System.Net.WebClient()) 
     { 
      var path = @"D:\Baixar automaticamente"; // HACK Pegar isso dos settings na versão final 
      var data = Helper.Retry(() => wc.DownloadData(sLinkTorCache), TimeSpan.FromSeconds(3), 5); 
      string fileName = null; 

      // Try to extract the filename from the Content-Disposition header 
      if (!string.IsNullOrEmpty(wc.ResponseHeaders["Content-Disposition"])) 
      { 
       fileName = wc.ResponseHeaders["Content-Disposition"].Substring(wc.ResponseHeaders["Content-Disposition"].IndexOf("filename=") + 10).Replace("\"", ""); 
      } 

      var torrentPath = Path.Combine(path, fileName ?? "Arch Linux Distro"); 

      if (File.Exists(torrentPath)) 
      { 
       File.Delete(torrentPath); 
      } 

      Helper.Retry(() => wc.DownloadFile(new Uri(sLinkTorCache), torrentPath), TimeSpan.FromSeconds(3), 5); 
     } 

Helper.Retry (Попытка выполнить метод снова в случае HTTP исключений):

public static void Retry(Action action, TimeSpan retryInterval, int retryCount = 3) 
    { 
     Retry<object>(() => 
     { 
      action(); 
      return null; 
     }, retryInterval, retryCount); 
    } 

    public static T Retry<T>(Func<T> action, TimeSpan retryInterval, int retryCount = 3) 
    { 
     var exceptions = new List<Exception>(); 

     for (int retry = 0; retry < retryCount; retry++) 
     { 
      try 
      { 
       if (retry > 0) 
        System.Threading.Thread.Sleep(retryInterval); // TODO adicionar o Using pro thread 
       return action(); 
      } 
      catch (Exception ex) 
      { 
       exceptions.Add(ex); 
      } 
     } 

     throw new AggregateException(exceptions); 
    } 
+0

Почему вы скачиваете файл дважды в коде? 'DownloadData' и' DownloadFile' – Rob

ответ

1

Первоначально h сайт отвечал с барахлом, если он считал, что это запрос от бота (то есть он проверял некоторые из заголовков). После просмотра с Fiddler - кажется, что возвращенные данные точно такие же как для веб-браузера, так и для кода. Это означает, что мы не должным образом дефлируем (извлекаем) ответ. Для веб-серверов очень часто приходится сжимать данные (используя что-то вроде gzip). WebClient делает не автоматически дефлирует данные.

Использование ответа от Automatically decompress gzip response via WebClient.DownloadData - Мне удалось заставить его работать правильно.

Также обратите внимание, что вы дважды загружаете файл. Вам не нужно это делать.

Рабочий код:

//Taken from above linked question 
class MyWebClient : WebClient 
{ 
    protected override WebRequest GetWebRequest(Uri address) 
    { 
     HttpWebRequest request = base.GetWebRequest(address) as HttpWebRequest; 
     request.AutomaticDecompression = DecompressionMethods.Deflate | DecompressionMethods.GZip; 
     return request; 
    } 
} 

И использовать его:

string sLinkTorCache = @"http://torcache.net/torrent/C348CBCA08288AE07A97DD641C5D09EE25299FAC.torrent"; 
using (var wc = new MyWebClient()) 
{ 
    var path = @"C:\Junk"; 
    var data = Helper.Retry(() => wc.DownloadData(sLinkTorCache), TimeSpan.FromSeconds(3), 5); 
    string fileName = ""; 

    var torrentPath = Path.Combine(path, fileName ?? "Arch Linux Distro.torrent"); 

    if (File.Exists(torrentPath)) 
     File.Delete(torrentPath); 

    File.WriteAllBytes(torrentPath, data); 
} 
+0

Спасибо, Роб, это сработало! –

Смежные вопросы