0
        try
        {
            responseFile = (HttpWebResponse)requestFile.GetResponse();
        }
        catch (WebException exRequestFile)
        {
            MessageBox.Show(exRequestFile.Message);
            closeRequest = false;
        }

and

if(closeRequest == true) responseFile.Close();   

So now my problem:

If i try to download a file, it does so, closes the response. All good. However, if I type wrong URL (with 404 returned or smth), I can't close the response because it gives me nullreference error. So I close it only when I get a response.

However, after providing wrong URL and not closing response, further tries to download anything result in timeout (even if URL is correct).

Why is that happening and can I resolve it somehow?

EDIT: Full code of class:

public void DownloadAndReplace(string webFile, string sourceFile)
    {
        var requestFile = (HttpWebRequest)WebRequest.Create(webFile);
        var requestMD5 = (HttpWebRequest)WebRequest.Create(webFile + ".md5");
        var requestSHA = (HttpWebRequest)WebRequest.Create(webFile + ".sha");
        bool closeRequest = true;
        _location = sourceFile + "\\" + OriginalFileName(webFile);
        requestFile.Method = "HEAD";
        requestFile.Timeout = 2000;
        HttpWebResponse responseFile = null;
        HttpWebResponse responseMD5 = null;
        HttpWebResponse responseSHA = null;
        try
        {
            responseFile = (HttpWebResponse)requestFile.GetResponse();
        }
        catch (WebException exRequestFile)
        {
            MessageBox.Show(exRequestFile.Message);
            closeRequest = false;
        }
        if (!File.Exists(_location) || responseFile.LastModified > File.GetLastWriteTime(_location))
        {
            downloadFile(webFile, _location);
            if (_controlsRef.chooseMD5.Checked)
            {
                try
                {
                    responseMD5 = (HttpWebResponse)requestMD5.GetResponse();
                    downloadFile(webFile + ".md5", _location);
                    responseMD5.Close();
                }
                catch (WebException exRequestFile)
                {
                    MessageBox.Show(exRequestFile.Message + " " + webFile + ".md5");
                }                 
            }

            else if (_controlsRef.chooseSHA1.Checked)
            {
                try
                {
                    responseSHA = (HttpWebResponse)requestSHA.GetResponse();
                    downloadFile(webFile + ".sha", _location);
                    responseSHA.Close();
                }
                catch (WebException exRequestFile)
                {
                    MessageBox.Show(exRequestFile.Message + " " + webFile + ".sha");
                }                   
            }                
        }
        else MessageBox.Show("Newest version");
        if(closeRequest == true) responseFile.Close();


public void downloadFile(string urlAddress, string location)
    {
        _fileHasher = new HashFile(_controlsRef);

        using (var downloadClient = new WebClient())
        {
            downloadClient.DownloadFileCompleted += new System.ComponentModel.AsyncCompletedEventHandler(Completed);
            downloadClient.DownloadProgressChanged += new DownloadProgressChangedEventHandler(ProgressChanged);

            Uri URL = new Uri(urlAddress);
            if (location == Environment.GetFolderPath(Environment.SpecialFolder.Desktop))
            {
                location = location + "\\" + OriginalFileName(urlAddress);
                this._location = location;
            }
            else location = _location;

            _downloadStopWatch.Start();
            if (File.Exists(location))
            {
                File.Delete(location);
            }
            if (_isFile == true)
            {
                try
                {
                    downloadClient.DownloadFileAsync(URL, location);
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message);
                    _isFile = false;
                }
            }
        }                                  
    }

private string OriginalFileName(string urlAddress)
    {

        var requestFile = (HttpWebRequest)WebRequest.Create(urlAddress);
        requestFile.Method = "HEAD";
        HttpWebResponse responseFile = null;
        string originalFileName = "";

        try
        {
            responseFile = (HttpWebResponse)requestFile.GetResponse();               
        }
        catch (WebException exResponse)
        {
            MessageBox.Show(exResponse.Message);
            _isFile = false;

        }
        if (_isFile == true)
        {
            int segmentLenght = responseFile.ResponseUri.Segments.Length;
            originalFileName = responseFile.ResponseUri.Segments[segmentLenght - 1];
            responseFile.Close();
        }

        return originalFileName;
    }

To further clarify:

  1. I provide URL for existing file 1. All is ok.
  2. I provide URL for existing file 2. All is ok.
  3. I provide URL for non-exisitng file 3. It throws me an 404 error.
  4. I provide URL for existing file 4. I get program hangup and timeout.
Januszoff
  • 315
  • 1
  • 16

1 Answers1

0

Wrap your HttpWebResponse inside a using statement so that the object can be disposed correctly.

Something like this:

   try
    {
       using(responseFile = (HttpWebResponse)requestFile.GetResponse())
       {
           ...your code...
       }
    }
    catch (WebException exRequestFile)
    {
        MessageBox.Show(exRequestFile.Message);
        closeRequest = false;
    }

"using" reference: https://msdn.microsoft.com/en-us/library/yh598w02.aspx

Hugh
  • 450
  • 3
  • 13