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

C# 如何从System.Net.WebException恢复:连接更改时无法连接到远程服务器,c#,webclient,C#,Webclient,我已经编写了一个c#程序,该程序成功地连接到远程主机,无论是否使用代理。我们在两个不同的网络中工作,家庭网络和办公网络,它们使用代理。下面是代码片段 while(true) { Thread.sleep(5000); using (var client = new WebClient()) { client.Headers[HttpRequestHeader.Accept] = "application/json"; client.Headers[HttpRequestH

我已经编写了一个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发出请求。如果程序在这两个网络中启动,它将在这两个网络中工作。但是,如果我在家里启动程序并休眠,或者让计算机休眠并在office中重新启动,我会遇到以下异常

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)
原因是第一次建立的连接将在后续请求中重用。当我遇到这个异常时,有没有办法强制创建连接

附言:

事件代码。GetInsertURL()


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

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


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

基于经验而非知识:
使用HttpWebRequest而不是webClient,它更健壮。
我的例子太乱了,但这就是基础:

var httpWebRequest=(httpWebRequest)System.Net.WebRequest.Create(URI)

为什么不为每个请求创建一个连接呢?或者你不能在外部循环中捕获异常,然后建立一个新连接并使用它吗?不知道如何建立一个新连接。即使我们正在创建一个新的webclient,它看起来仍在重复使用连接。您确定连接问题吗?我感觉问题来自
事件。GetInsertURL()
。难道你不能尝试将url解析为不同的IP,每个IP都是其网络的专有IP吗?我可以在程序启动后在网络之间切换时重现此问题。我正在访问的URL位于Internet上,它可以从任何网络访问。Event.GetInsertURL()正在创建指向我的google app engine应用程序的URL,该URL是常量。Event.GetInsertURL()将是WebClient的“连接”,因此我仍然不确定您所说的保持打开的连接是什么?因为错误可能不是来自所显示的代码。您是否有可能在所示方法之外有一些连接代码(我认为
persistor.RemoveBroadCastedRows
可能与异常相关)
public static string GetInsertURL(){
 return "https://my-app.appspot.com/_ah/api/"eventendpoint/v1/insertEvents";
}