2010-05-15 92 views
0

我有一个应用程序,创建了很多web请求来下载一个网站的新闻页面 (我已经测试了很多网站) 一段时间后,我发现应用程序减速在获取html源代码后,我发现HttpWebResonse无法获得响应。我只发布做这项工作的功能。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; 
    } 

任何解决方案将不胜感激

回答

0

取功能被递归调用,并总是创建的HttpWebRequest但是当URL匹配只是释放。您必须在其他语句中关闭请求和响应。

0

我同意@volody,也HttpWebRequest已经有属性称为MaximumAutomaticRedirections,它被设置为50,你可以将它设置为5自动实现你在这个代码中找到什么,无论如何,它会引发异常,由您的代码处理。

只需设置

request.MaximumAutomaticRedirections = 5; 
+0

感谢您的意见(volody,阿卡什卡瓦),我已经解决了我的代码,但是这不是我的问题(重定向是不是我的观点的原因,而是从未发生过它只是一个预防代码) 这个应用程序获取大约500个网页,然后它突然挂起,我不知道究竟是从哪里来的。 任何其他解决方案? – Ehsan 2010-05-16 05:15:15

+0

这可能是线程问题,以及如何管理线程。你应该尝试.net 4.0的并行扩展,这可能会有所帮助,因为你的代码可能会有一些死锁,并行扩展可以通过改进的线程提供相同的逻辑。另外,它可能是你的防火墙阻止它认为它是某种攻击,并且每个域只允许同时允许最多2个http连接,所以我认为你应该按域对它们进行分组并将它们排队到一个域,这可能有助于。 – 2010-05-16 09:44:33