首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >HttpWebResponse挂断

HttpWebResponse挂断
EN

Stack Overflow用户
提问于 2015-07-07 10:34:59
回答 1查看 74关注 0票数 0
代码语言:javascript
复制
        try
        {
            responseFile = (HttpWebResponse)requestFile.GetResponse();
        }
        catch (WebException exRequestFile)
        {
            MessageBox.Show(exRequestFile.Message);
            closeRequest = false;
        }

代码语言:javascript
复制
if(closeRequest == true) responseFile.Close();   

所以现在我的问题是:

如果我试图下载一个文件,它就会关闭响应。一切都很好。但是,如果输入错误的URL (返回404或smth),则无法关闭响应,因为它会给出空引用错误。所以只有在收到回复时我才会关闭它。

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

为什么会发生这种事,我能以某种方式解决吗?

编辑:全班代码:

代码语言:javascript
复制
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. 我为非exisitng文件3提供了URL,它引发了404错误。
  4. 我提供了现有文件4的URL。我得到程序挂起和超时。
EN

回答 1

Stack Overflow用户

发布于 2015-07-07 11:27:14

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

就像这样:

代码语言:javascript
复制
   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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31266183

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档