HttpWebResponse挂断了

时间:2015-07-07 10:34:59

标签: c#

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

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

所以现在我的问题是:

如果我尝试下载文件,它会这样做,关闭响应。都好。 但是,如果我键入错误的URL(返回404或smth),我无法关闭响应,因为它给我null引用错误。所以我只有在收到回复时才关闭它。

但是,在提供错误的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. 我提供现有文件的URL 1.一切正常。
  2. 我提供现有文件的URL 2.一切正常。
  3. 我为非exisitng文件提供了网址3.它引发了404错误。
  4. 我提供现有文件的URL 4.我得到程序挂起和超时。

1 个答案:

答案 0 :(得分: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