我編寫了一個c#程序,該程序成功地連接到帶代理和不帶代理的遠程主機。我們在兩個不同的網絡中工作,即使用代理的家庭和辦公室網絡。這是代碼片段。如何從System.Net.WebException中恢復:當連接發生變化時無法連接到遠程服務器
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.GetInsertURL的代碼()
public static string GetInsertURL(){
return "https://my-app.appspot.com/_ah/api/"eventendpoint/v1/insertEvents";
}
爲什麼不爲每個請求創建一個連接?或者你不能在外部循環中捕獲異常,然後建立一個新的連接並使用它? – 2015-03-03 07:10:54
不知道如何建立新的連接。即使我們正在創建一個新的Web客戶端,它看起來就是重用了連接。 – Buddha 2015-03-03 10:23:19
你確定連接有問題嗎?我有一種感覺,問題來自'Event.GetInsertURL()'。難道不是你試圖將url解析爲不同的IP地址,每個IP地址都獨佔其網絡? – samy 2015-03-03 10:23:43