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

иHttpWebResponse отбоя

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

Так что теперь моя проблема:

Если я пытаюсь загрузить файл, он делает это, закрывает ответ. Все хорошо. Однако, если я нахожу неправильный URL (с возвратом 404 или smth), я не могу закрыть ответ, потому что он дает мне ошибку nullreference. Поэтому я закрываю его только тогда, когда получаю ответ.

Однако, после предоставления неправильного URL-адреса и не закрытия ответа, дальнейшие попытки загрузить что-либо приведет к таймауту (даже если URL-адрес верен).

Почему это происходит, и могу ли я как-то его решить?

EDIT: Полный код класса:

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

Для дальнейшего уточнения:

  1. Я обеспечиваю URL для существующего файла 1. Все в порядке.
  2. Я предоставляю URL для существующего файла 2. Все в порядке.
  3. Я предоставляю URL-адрес файла non-exisitng 3. Он выдает мне ошибку 404.
  4. Я предоставляю URL для существующего файла 4. Я получаю зависание и тайм-аут программы.
+0

Что такое 'responseFile'? – CodeCaster

+1

@CodeCaster Я добавлю код для своего класса, чтобы все было ясно. – Januszoff

+0

Возможно, вы захотите ознакомиться с http://stackoverflow.com/questions/1968522/c-using-statements-with-httpwebrequests-httpwebresponses, в котором описано, как правильно очистить объекты HttpWebRequest и HttpWebResponse. –

ответ

0

Оберните свой HttpWebResponse внутри оператора using, чтобы объект мог быть удален правильно.

Что-то вроде этого:

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

"с помощью" ссылка: https://msdn.microsoft.com/en-us/library/yh598w02.aspx

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