2014-04-14 40 views
0

嗨大家即时通讯尝试创建一个方法,将始终返回一个网址源,如果例如互联网熄灭它将继续工作,直到它出现并返回网址源等等,如果还有其他东西发生。到目前为止在我的方法,当我“关闭”互联网和“打开它”回程序继续正常,但我有一个问题时发生超时,我在一个循环中“下降”我知道while(true)是不是正确的做法,但即时通讯用于我的测试。Webrequest不能“逃生”超时

那么如何跳过超时异常并“重试”我的方法?

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();成为芬兰条款,但它没有帮助。

编辑:控制台每14秒写一次这条消息,因为我的超时时间我认为它与此相关。

+0

你目前的方法有什么问题?你的超时会导致一个异常,并且你循环回来? – CathalMF

+0

@CathalMF我不知道,但第一次超时后,似乎是在一个循环。它就像之后的那样永远处于超时状态。 – Incognito

+0

你确定它不是你的服务器端正在破坏导致超时循环吗? – CathalMF

回答

1

的备选解决方案摆脱超时问题的可以是使用WebBrowser组分和导航到所需的URL(webbrowser1.Navigate(url);),并且直到documentcompleted事件引发在循环中等待,然后获得源代码由这条线:

string source = webbrowser1.DocumentText; 
+0

以及即时猜测这可以做的工作,但我想解决我的方法,并找到我的问题背后的原因。 – Incognito

0

好吧,似乎我找到了一个与请求的服务点相关的解决方案。

因此,在我发现超时发生时使用此来释放连接。

hwr.ServicePoint.CloseConnectionGroup(hwr.ConnectionGroupName); 

我会保持更新。