2016-01-14 4 views
0

Мне нужно загрузить несколько больших файлов, поэтому мне нужно более длинное время загрузки DownloadFile(), чем 1 минута по умолчанию.C#, невозможно установить DownloadFile() timeout

Проблема в том, что мое решение не увеличивает таймаут. Он остается на 1 минуту.

Я создал этот класс:

public class MyWebClient : WebClient 
{ 
    private int timeout; 

    public int Timeout 
    { 
     get 
     { 
      return timeout; 
     } 
     set 
     { 
      timeout = value; 
     } 
    } 

    public MyWebClient() 
    { 
     this.timeout = 1200000; 
    } 

    protected override WebRequest GetWebRequest(Uri uri) 
    { 
     WebRequest w = base.GetWebRequest(uri); 
     w.Timeout = this.timeout; 
     return w; 
    } 
} 

Calling это следующим образом:

using (MyWebClient client = new MyWebClient()) 
{ 
    client.Timeout = 1200000; 
    client.DownloadFile(new Uri(fileUrl), localFile); 
} 

Любые идеи?

Спасибо!

+0

Вы уверены, что тайм-аут остается на 1 минуту? Если я выполнил это на своей машине, но изменил ее на 1 мс, я сразу же тайм-аут. ([Здесь] (http://stackoverflow.com/questions/601861/set-timeout-for-webclient-downloadfile) - это связанный с этим вопрос :, где ответ с наибольшим количеством upvotes, похоже, использует тот же подход.) – steinar

+0

100%, я добавил временной интервал для измерения времени выполнения функции. Это всегда 1: 00-1: 01 минута – Louisa

+0

Интересно. Возможно, это другая настройка, которая убивает соединение, т. Е. В вашей сети или машине. Можете ли вы попробовать установить его на 1 и посмотреть, закрывается ли он напрямую? Возможно, также, что класс веб-клиента использует перед выполнением команду 'min (Timeout, 1 минута)'. – steinar

ответ

0

изменить код, как показано ниже

private class MyWebClient : WebClient 
{ 
    public int Timeout { get; set; } 

    protected override WebRequest GetWebRequest(Uri uri) 
    { 
     WebRequest w = base.GetWebRequest(uri); 
     w.Timeout = Timeout; 
     ((HttpWebRequest) w).ReadWriteTimeout = Timeout; 
     return w; 
    } 
} 

и называют, как вы упомянули.

ОБНОВЛЕНО: - другое мудрое использование, как показано ниже

HttpWebRequest req = (HttpWebRequest)WebRequest.Create(Url); 
req.Timeout = 1200000; 
req.ReadWriteTimeout = 1200000; 
var w = (HttpWebResponse)req.GetResponse(); 

using (Stream file = File.OpenWrite(localFile)) 
{ 
    w.GetResponseStream().CopyTo(file); 
} 
+0

Не помогло. Он по-прежнему выполняет тайм-аут через 1 минуту (т. Е. Тайм-аут по умолчанию) – Louisa

+0

Попробуйте client.DownloadFileAsync (новый Uri (fileUrl), localFile); или проверить отредактированный ответ – Avaan

+0

Что вы редактировали? – Louisa

0

Попробуйте этот код в запросе клиента

using (MyWebClient client = new MyWebClient()) 
{ 
    client.Timeout = 1200000; 
    byte[] data = client.DownloadData(url); 
    File.WriteAllBytes(localFile, data);  
} 
+0

По-прежнему получать таймаут по умолчанию. – Louisa

+0

кажется, что тайм-аут находится на сервере. проверить код сервера или спецификации сервиса –

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