【问题标题】:HttpWebResonse hangs on multiple requestHttpWebResonse 挂起多个请求
【发布时间】:2011-02-19 19:13:23
【问题描述】:

我有一个应用程序创建许多网络请求来下载网站的新闻页面 (我已经测试了许多网站) 过了一会儿,我发现应用程序在获取 html 源代码时变慢了,然后我发现 HttpWebResonse 无法获得响应。我只发布完成这项工作的功能。

    public PageFetchResult Fetch()
    {
        PageFetchResult fetchResult = new PageFetchResult();
        try
        {
            HttpWebRequest req = (HttpWebRequest)HttpWebRequest.Create(URLAddress);
            HttpWebResponse resp = (HttpWebResponse)req.GetResponse();
            Uri requestedURI = new Uri(URLAddress);
            Uri responseURI = resp.ResponseUri;
            if (Uri.Equals(requestedURI, responseURI))
            {
                string resultHTML = "";
                byte[] reqHTML = ResponseAsBytes(resp);
                if (!string.IsNullOrEmpty(FetchingEncoding))
                    resultHTML = Encoding.GetEncoding(FetchingEncoding).GetString(reqHTML);
                else if (!string.IsNullOrEmpty(resp.CharacterSet))
                    resultHTML = Encoding.GetEncoding(resp.CharacterSet).GetString(reqHTML);

                resp.Close();
                fetchResult.IsOK = true;
                fetchResult.ResultHTML = resultHTML;
            }
            else
            {
                URLAddress = responseURI.AbsoluteUri;
                relayPageCount++;
                if (relayPageCount > 5)
                {
                    fetchResult.IsOK = false;
                    fetchResult.ErrorMessage = "Maximum page redirection occured.";
                    return fetchResult;
                }
                return Fetch();
            }
        }
        catch (Exception ex)
        {
            fetchResult.IsOK = false;
            fetchResult.ErrorMessage = ex.Message;
        }
        return fetchResult;
    }

任何解决方案都将不胜感激

【问题讨论】:

    标签: c# html httpwebresponse


    【解决方案1】:

    Fetch 函数被递归调用,总是创建 HttpWebRequest 但只有在匹配 url 时才释放。您必须在 else 语句中关闭请求和响应。

    【讨论】:

      【解决方案2】:

      我同意@volody,而且 HttpWebRequest 已经有一个名为 MaximumAutomaticRedirections 的属性,该属性设置为 50,您可以将其设置为 5 以自动实现您在此代码中查找的内容,它会引发异常,这将是由您的代码处理。

      设置好了

      request.MaximumAutomaticRedirections  = 5;
      

      【讨论】:

      • 感谢您的 cmets(volody,akash kava),我已经修复了我的代码,但这不是我的问题(重定向不是我的意思,因为它永远不会发生它只是一个预防性代码)这个应用程序获取大约 500 个网页然后它突然挂起我不知道到底是什么来的。还有其他解决方案吗??
      • 这可能是线程问题,以及您如何管理线程。您应该尝试 .net 4.0 的并行扩展,这可能会有所帮助,因为您的代码可能有一些死锁,而并行扩展可以提供相同的逻辑并改进线程。另外,可能是您的防火墙阻止了它,认为它是某种攻击,而且每个域同时只允许最多 2 个 http 连接,所以我认为您应该按域对请求进行分组并将它们排队到一个域中,这可能会有所帮助.
      猜你喜欢
      • 1970-01-01
      • 2012-03-31
      • 2014-01-14
      • 2022-12-12
      • 1970-01-01
      • 2021-10-22
      • 2017-01-06
      • 2016-08-09
      • 1970-01-01
      相关资源
      最近更新 更多