【问题标题】:DownloadString timed out下载字符串超时
【发布时间】:2012-01-11 04:07:37
【问题描述】:

我有一个返回网页内容的方法:

        private string FetchHTML(string sUrl, Encoding encoding)
        {
            System.Net.WebClient oClient = new System.Net.WebClient();
            oClient.Encoding = encoding;
            return System.Web.HttpUtility.HtmlDecode(oClient.DownloadString(sUrl));
        }

但是,当我尝试从 livejournal 加载链接(例如,http://mos-jkh.livejournal.com/769579.html)时,我在 DownloadString 处收到此异常:

请求已中止:操作已超时。

这是一个已知问题吗?为什么 DownloadString 不适用于某些网页,是否有解决方案?或者是否有替代 DownloadString 的方法?

【问题讨论】:

  • 除了您发布的链接之外,您能否举一个 URL 超时的示例?也许比 livejournal 有名气?查看您用于调用FetchHTML 的特定代码也将有所帮助(可能将任何变量替换为它们所代表的值)。

标签: c# asp.net


【解决方案1】:

一些网站足够聪明,可以检查请求是否由浏览器发出。当他们检测到请求不是通过浏览器完成时,他们不会响应。但是很容易通过发送请求的用户代理信息来欺骗他们。所以解决方案是在 FetchHTML 方法中添加一行代码:

    private string FetchHTML(string sUrl, Encoding encoding)
    {
        System.Net.WebClient oClient = new System.Net.WebClient();
        oClient.Encoding = encoding;
        // set the user agent to IE6
        oClient.Headers.Add("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; .NET CLR 1.0.3705;)");
        return System.Web.HttpUtility.HtmlDecode(oClient.DownloadString(sUrl));
    }

PS:为了检测我使用 Fiddler 而不是 Wireshark 的问题,我发现它太复杂了。

【讨论】:

    【解决方案2】:

    嗯,异常表示操作超时。有时这似乎是一件非常合理的事情 - 可能存在缓慢的服务器,缓慢的互联网连接等 - 如果您尝试从同一主机下载多个页面,则将使用连接池,这可能会导致这种情况即使每个单独的请求看起来都不错,也会发生。

    使用Wireshark 之类的东西来了解网络级别的情况。

    【讨论】:

      猜你喜欢
      • 2011-10-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-03
      • 2015-03-31
      • 2015-01-13
      相关资源
      最近更新 更多