Webrequest无法逃脱"超时

时间:2014-04-14 15:55:00

标签: c# timeout httpwebrequest webrequest internet-connection

大家好我试图创建一个始终返回url源的方法,如果例如互联网关闭它将继续工作直到它出现并返回url源等等,如果发生其他事情。到目前为止,当我关闭"互联网和"打开它"返回程序继续正常但是当发生超时时我遇到了问题并且即将发生错误"循环我知道while(true)不是正确的方法,但是我将它用于我的测试。

那么我怎样才能跳过超时异常和"重试"我的方法?

public static async Task<string> GetUrlSource(string url)
{
    string source = "";
    while (true)
    {
        HttpWebRequest hwr = (HttpWebRequest)WebRequest.Create(url);
        hwr.AllowAutoRedirect = true;
        hwr.UserAgent = UserAgent;
        hwr.Headers.Add(hd_ac_lang[0], hd_ac_lang[1]);
        hwr.AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate;
        hwr.Timeout = 14000;
        try
        {
            using (var response = hwr.GetResponse())
            {
                using (var reader = new StreamReader(response.GetResponseStream()))
                {
                    source = await reader.ReadToEndAsync();
                    if (check_source(source))
                    {
                        return source;
                    }
                 }
             }
         }
         catch (WebException ex)
         {
             hwr.Abort();
             if (ex.Status == WebExceptionStatus.ProtocolError)
             {
                if (((HttpWebResponse)ex.Response).StatusCode == HttatusCode.NotFound)
                {
                    // handle the 404 here
                    return "404";
                 }
              }
              else
              {
                 Console.WriteLine(ex.Status.ToString());    
              }
         }
    }
}

注意:我曾经有过hwr.Abort();进入一个finnaly条款,但它没有帮助。

编辑:控制台每隔14秒写一条此消息,因为我的超时时间我觉得它与此有关。

2 个答案:

答案 0 :(得分:1)

摆脱超时问题的替代解决方案可以是使用WebBrowser组件并导航到所需的URL(webbrowser1.Navigate(url);),并在循环中等待{{1}引发了event,然后通过这一行获取源代码:

documentcompleted

答案 1 :(得分:0)

好吧,我发现了一个与请求的服务点相关的解决方案。

因此,当我发现超时时,我会使用它来释放连接。

hwr.ServicePoint.CloseConnectionGroup(hwr.ConnectionGroupName);

我会保持更新。