2015-02-24 85 views
2

我編寫了一個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"; 
} 
+0

爲什麼不爲每個請求創建一個連接?或者你不能在外部循環中捕獲異常,然後建立一個新的連接並使用它? – 2015-03-03 07:10:54

+0

不知道如何建立新的連接。即使我們正在創建一個新的Web客戶端,它看起來就是重用了連接。 – Buddha 2015-03-03 10:23:19

+0

你確定連接有問題嗎?我有一種感覺,問題來自'Event.GetInsertURL()'。難道不是你試圖將url解析爲不同的IP地址,每個IP地址都獨佔其網絡? – samy 2015-03-03 10:23:43

回答

0

的代碼已創建爲new WebClient()每個連接一個新的客戶端會話。

這可能是睡眠發生在一個會話過程中,然後觸發故障。

一般而言,任何網絡方法都可能在意外情況下發生。唯一真正的解決方案是將代碼封裝在try/catch塊中,並在報告永久性故障之前在正確的條件下重試幾次。

0

基於以上知識經驗:
使用HttpWebRequest而不是webClient,它只是更強大。
我的例子太亂了,但這是基礎:
var httpWebRequest =(HttpWebRequest)System.Net.WebRequest.Create(URI);

相關問題