【问题标题】:Why does WebRequest timeout always on the first request, but never on any subsequent ones为什么WebRequest总是在第一个请求时超时,但在任何后续请求中都不会超时
【发布时间】:2011-09-30 10:01:06
【问题描述】:

遇到问题,第一次调用 WebRequest.GetResponse() 时挂起并超时,但在第一次调用后,一切正常。

        try {
            WebRequest myHttpWebRequest = WebRequest.Create(@"http://192.168.x.x/");
            // Sends the HttpWebRequest and waits for the response.         
            myHttpWebRequest.Timeout = 1000;
            WebResponse myHttpWebResponse = myHttpWebRequest.GetResponse();
        } catch(Exception e) {
            Console.WriteLine("Failure 1");
        }
        try {
            WebRequest myHttpWebRequest = WebRequest.Create(@"http://192.168.x.x/");
            // Sends the HttpWebRequest and waits for the response.         
            myHttpWebRequest.Timeout = 1000;
            WebResponse myHttpWebResponse = myHttpWebRequest.GetResponse(); 
        } catch(Exception e) {
            Console.WriteLine("Failure 2");
        }
        try {
            WebRequest myHttpWebRequest = WebRequest.Create(@"http://192.168.x.x/");
            // Sends the HttpWebRequest and waits for the response.         
            myHttpWebRequest.Timeout = 1000;
            WebResponse myHttpWebResponse = myHttpWebRequest.GetResponse(); 
        } catch(Exception e) {
            Console.WriteLine("Failure 3");
        }

在控制台应用程序中使用此代码,我总是收到Failure 1。是否在调试器下运行。我做了一个 1000 循环,它总是在第一个循环中失败,从没有其他循环。事实上,读取 Web 服务器的日志,它实际上从来没有收到过第一个请求。我在这里遗漏了什么吗?

【问题讨论】:

  • 你有没有得到这个问题的解决方案'
  • 是的,这是运行 VPN 的结果。关闭 VPN 或类似 VPN 的软件解决了这个问题。

标签: c# .net httpwebrequest webrequest


【解决方案1】:

我遇到了同样的问题,在我的例子中,我增加了 WebRequest 对象的 timeout 值并且它起作用了!

webRequest.Timeout = int.Parse(60000);

(我已将超时属性设置为 60 秒)。

【讨论】:

  • 听起来更像是超时问题....我将超时设置为 3600000 并在 12 分钟后停止...
  • 3600000 相当大,
  • 我当时正在测试
  • 我想通了...与vpn有关...停止了vpn,第一次尝试一切正常
  • 仅供参考...我发现这很困难..超时是整个请求的时间...不仅仅是不活动...所以如果你有一个慢速连接的大帖子..即使它正在主动发送数据也可能发生超时
【解决方案2】:

可能有点晚了,但我的效果完全一样。最后的原因是,网络中没有默认网关。解决方案是选择性地设置 request.Proxy = null

var request = WebRequest.Create(UriString);
request.Timeout = Timeout;
if (_disableProxy)
{
    request.Proxy = null;
}
if (request is HttpWebRequest)
{
    var response = (HttpWebResponse)request.GetResponse();
    responseStream = response.GetResponseStream();

}
if (request is FtpWebRequest)
{
    var response = (FtpWebResponse)request.GetResponse();
    responseStream = response.GetResponseStream();
}
else if (request is FileWebRequest)
{
    var response = (FileWebResponse)request.GetResponse();
    responseStream = response.GetResponseStream();
}

希望这会有所帮助。

【讨论】:

    【解决方案3】:

    如果您在请求响应之前没有刷新\关闭 RequestStream,您可以获得与此非常相似的行为。此行为似乎存在于 .NET 3.5 中,但已在 .NET Framework 4.5 中得到解决。我在切换框架时注意到了这个问题——在 4.5 中工作的代码(没有关闭)在针对 3.5 编译时停止工作。也许尝试明确获取 RequestStream 并将其作为解决方法关闭。

    【讨论】:

    • 这几乎是 John 解释的内容,我不认为关闭流是一种“解决方法”,而是“必须做的”。
    【解决方案4】:

    编辑:我意识到下面的答案将适合完全相反的情况,即第一个请求有效但其他请求无效。然而,这仍然很重要 - 你真的应该处理你的回复。如果您在报告错误时也报告异常消息,这也很有用...

    要弄清楚这里发生了什么,您应该真正使用WireShark 之类的东西,这样您就可以看到问题是正在发出请求但没有响应,或者甚至没有发出请求。

    我想知道问题是否实际上是它正在解析代理,或者类似的东西......并且在 second 请求之前有足够的时间来解决它超时。尝试增加超时。同样,这应该可以通过 WireShark 看到。


    您没有处理 Web 响应,因此第二个请求的连接池将超时等待恢复该连接。

    WebResponse 部分放入using 语句中,您可能会发现一切正常:

    using (WebResponse myHttpWebResponse = myHttpWebRequest.GetResponse())
    {
    }
    

    当然,这是假设您实际上响应做了一些事情。否则你可以写:

    myHttpWebRequest.GetResponse().Dispose();
    

    :)

    【讨论】:

    • 但它不是我得到超时的第二个请求,事实上,第二个工作得很好。第一个是超时。但是,我确实按照您所说的进行了更改,并且使用了(这只是一个测试,还不是真正的应用程序),并且没有任何区别。第一个请求仍然超时。
    • @Jeremy:是的,我刚刚注意到了。网站是否在第一个请求之前启动?
    • 我确实报告了异常,它超时了
    • 是的,内部 Web 服务器始终处于运行状态。事实上,我正在对访问日志进行跟踪,以查看请求进入,第一个请求永远不会到达服务器。
    • @Jeremy:我的意思是把它包含在你的控制台输出中。请参阅我的编辑以获取建议的前进方式 - 您确实需要查看网络上正在发生的事情。
    猜你喜欢
    • 2011-05-29
    • 1970-01-01
    • 2011-02-26
    • 1970-01-01
    • 1970-01-01
    • 2012-01-24
    • 2021-02-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多