如何从System.Net.WebException恢复:连接更改时无法连接到远程服务器

时间:2015-02-24 05:45:53

标签: c# webclient

我编写了一个c#程序,它成功连接到有和没有代理的远程主机。我们在两个不同的网络中工作,家庭和办公室网络,使用代理。这是代码片段。

while(true) {
  Thread.sleep(5000);
  using (var client = new WebClient()) {
    client.Headers[HttpRequestHeader.Accept] = "application/json";
    client.Headers[HttpRequestHeader.ContentType] = "application/json";
    string result = client.UploadString(Event.GetInsertURL(), "POST", json);
    if (result.Contains("SUCCESS")) {
        // Console.WriteLine("SUCCESS");
    } 
  }
}

上面的代码在一个循环中运行,以便继续向同一个api发出请求。如果程序在这些网络中启动,它在两个网络中都有效。但是,如果我在家中启动程序并休眠或睡眠计算机并在办公室重新启动它,我会收到以下异常。

System.Net.WebException: Unable to connect to the remote server ---> System.Net.Sockets.SocketException: A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond 74.125.130.141:443
   at System.Net.Sockets.Socket.DoConnect(EndPoint endPointSnapshot, SocketAddress socketAddress)

原因是第一次建立的连接在后续请求中重用。当我得到这个例外时,有什么方法可以强制创建连接吗?

P.S:

Event of Event.GetInsertURL()

public static string GetInsertURL(){
 return "https://my-app.appspot.com/_ah/api/"eventendpoint/v1/insertEvents";
}

2 个答案:

答案 0 :(得分:0)

代码已经为new WebClient()中的每个连接创建了一个新的客户端会话。

可能是睡眠发生在其中一个会话过程中,然后触发故障。

通常,任何网络方法都可能在意外情况下发生。唯一真正的解决方案是将代码包装在try / catch块中,并在报告永久性故障之前在正确的条件下重试几次。

答案 1 :(得分:0)

基于经验而非知识:
使用HttpWebRequest而不是webClient,它更加健壮 我的例子太乱了,但那是基础:
var httpWebRequest =(HttpWebRequest)System.Net.WebRequest.Create(URI);