0

I need to download some large files, so I need a longer DownloadFile() timeout than the default 1 minute.

Problem is that my solution doesn't increase the timeout. It stays at 1 minute.

I have created this class:

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 it like this:

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

Any ideas?

Machavity
  • 30,841
  • 27
  • 92
  • 100
Louisa
  • 552
  • 1
  • 9
  • 22

2 Answers2

0

change your code as below

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;
    }
}

and call as you have mentioned.

UPDATED:-- other wise use as below

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);
}
Avaan
  • 4,709
  • 1
  • 10
  • 13
0

Try this code in client request

using (MyWebClient client = new MyWebClient())
{
  client.Timeout = 1200000;
  byte[] data = client.DownloadData(url);
  File.WriteAllBytes(localFile, data);    
}
prasun
  • 7,073
  • 9
  • 41
  • 59