【问题标题】:Webrequest cant "escape" timeoutWebrequest 不能“逃脱”超时
【发布时间】:2014-05-28 16:22:44
【问题描述】:

大家好,我正在尝试创建一个始终返回 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 秒写一次此消息,因为我的超时我认为这与此有关。

【问题讨论】:

  • 您当前的方法有什么问题?您的超时导致异常并且您循环回来?
  • @CathalMF 我也不知道,但是在第一次超时之后,它似乎陷入了循环。它就像 hwr 之后它永远处于超时状态。
  • 您确定不是您的服务器端导致超时循环中断?
  • 实际上我在本地运行这个应用程序,事实是我遇到了一些互联网问题,但尽管如此,如果我同时重新启动应用程序,它会正常运行。顺便说一句,异常每 14 秒运行一次,所以它不会释放一些资源或类似的东西。

标签: c# timeout httpwebrequest webrequest internet-connection


【解决方案1】:

ِ摆脱超时问题的另一种解决方案是使用WebBrowser组件并导航到所需的url(webbrowser1.Navigate(url);),然后循环等待直到引发documentcompleted事件,然后通过这一行获取源代码:

string source = webbrowser1.DocumentText;

【讨论】:

  • 好吧,我猜这可以解决问题,但我想修复我的方法并找出问题背后的原因。
【解决方案2】:

看来我找到了与请求的服务点相关的解决方案。

所以当我使用它来释放连接时发生超时。

hwr.ServicePoint.CloseConnectionGroup(hwr.ConnectionGroupName);

我会保持更新。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-01-26
    • 1970-01-01
    • 1970-01-01
    • 2016-09-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多