HttpWebResponse hanging up


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

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

现在我的问题是:

如果我尝试下载文件,它会关闭响应。所有的好。但是,如果我输入了错误的URL(返回404或smith),我就不能关闭响应,因为它给了我nullreference错误。因此,只有在得到响应时才关闭它。

但是,在提供错误的URL并且没有关闭响应之后,进一步尝试下载任何东西都会导致超时(即使URL是正确的)。

为什么会发生这种情况,我能解决它吗?

编辑:类的完整代码:

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. 我为现有文件1提供URL。
  2. 我为现有文件2提供URL。
  3. 我为不存在的文件3提供URL。它抛出一个404错误。
  4. 我为现有文件4提供URL。我得到程序挂起和超时。

将HttpWebResponse封装在using语句中,这样可以正确地处理对象。

像这样:

   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

最新更新