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