为什么WebRequest总是在第一次请求时超时,但从不在任何后续请求上超时

时间:2011-07-07 12:04:42

标签: c# .net httpwebrequest webrequest

遇到问题,呼叫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服务器的日志时,它实际上从未收到第一个请求。我在这里错过了什么吗?

4 个答案:

答案 0 :(得分:9)

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

也很有用

要弄清楚这里发生了什么,你应该使用类似WireShark之类的东西,这样你就可以看出问题是在做出请求但是没有响应,或者是否甚至没有做出。< / p>

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


您没有丢弃Web响应,因此第二个请求的连接池将等待重新启动该连接。

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

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

当然,假设你实际上某些事情。否则你可以写:

myHttpWebRequest.GetResponse().Dispose();

:)

答案 1 :(得分:3)

可能有点晚了,但我的效果完全相同。最后的原因是,网络中没有默认网关。解决方案是以optioally方式设置 request.Proxy = null

import Cocoa
//Error. Multiple inheritance from classes 'NSWindowController' and   'NSViewController'
class AllUnderControl: NSWindowController, NSViewController,NSTextViewDelegate
{
override var windowNibName: String?
{
return "AllUnderControl"
}

override func windowDidLoad() {
    super.windowDidLoad()
}
 //Error. Instance member 'inputDnaFromUser' cannot be used on type 'AllUnderControl'
var textView = inputDnaFromUser(frame: CGRectZero)

 //Error. Method does not override any method from its superclass
override func viewDidLoad() {
    textView.delegate = self
}

func textDidChange(notification: NSNotification) {
    // trigger your function
}

@IBOutlet var inputDnaFromUser: NSTextView!

希望这有帮助。

答案 2 :(得分:0)

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

答案 3 :(得分:0)

我遇到了同样的问题,在我的情况下,我增加了timeout对象的WebRequest值并且它有效了!

webRequest.Timeout = int.Parse(60000);

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