2011-09-21 165 views
1

我正在C#中製作一個程序,該程序需要與服務器建立連接。 爲了消除服務器故障,我使用冗餘來構建它。 由於這個原因,我在與它看起來像這樣服務器地址文本文件裏:通過評估服務器回覆嘗試服務器連接

2011-09-21 18:01 
http://server1.server.com 
http://server2.server.com 
http://server3.server.com 

的日期還有以確保方案具有服務器的一個新的列表。 它開始時的第一件事就是下載這個列表並比較日期。 如果下載的文件具有較新的日期,它將替換較舊的文件。

我現在想要發生的事情是,我希望程序讀取文件並列出可能的服務器列表(已完成),然後遍歷列表以找到正在給出的服務器服務器期待的回覆。

一旦收到答覆,它應該停止檢查並將變量「server」設置爲剛剛響應正確的服務器。

我一直在試圖用下面的程序,沒有任何的運氣:

int srvs = servers.Count(); 
int i = 0; 
string response = string.Empty; 
while (i < srvs) 
{ 
    var client = new WebClient(); 
    try 
    { 
     response = client.DownloadString(servers[i] + "testcon.php"); 
    } 
    catch (WebException wex) 
    { 
    } 
    finally 
    { 
     if (response == "OK") 
     { 
      server = servers[i]; 
     } 
    } 
    if (servers.Contains(server)) 
     break; 
    i++; 
} 

這沒有工作,也沒有停止循環,直到它在列表的末尾。 我想接下來的事情,是這樣的:

var client = new WebClient(); 
foreach (string s in servers) 
{ 
    try 
    { 
     response = client.DownloadString(s + "testcon.php"); 
    } 
    catch (WebException wex) 
    { 
    } 
    finally 
    { 
    if (response == "OK") 
     server = s; 
    } 
     break; 
    } 

我應該怎麼做才能讓它停止和設置服務器爲預期的響應的第一臺服務器(目前與「OK」)。

+1

出病態的好奇心,爲什麼不使用集羣選項或DNS輪循? –

+0

由於兩個原因:1.我不知道如何設置羣集,但實際購買兩個羣集VPS /根服務器除外。和2:我不知道如何設置DNS循環。我使用的服務器位於世界上不同的位置,我知道服務器所有者,所以我可以免費獲得它們。雖然對於最後一個問題/答案..這是我會查找的東西。 :) – Rickard

回答

1

這樣的:

int srvs = servers.Count(); 
int i = 0; 
string response = string.Empty; 
while (i < srvs) 
{ 
    var client = new WebClient(); 
    try 
    { 
     response = client.DownloadString(servers[i] + "testcon.php"); 
     if (response == "OK") 
     { 
      server = servers[i];. 
      break; 
     } 
    } 
    catch (WebException wex) 
    { 
    } 
    i++; 
} 

或本:

var client = new WebClient(); 
foreach (string s in servers) 
{ 
    try 
    { 
     response = client.DownloadString(s + "testcon.php"); 
     if (response == "OK") 
     { 
      server = s; 
      break; 
     } 
    } 
    catch (WebException wex) 
    { 
    } 
} 
+0

嘿,謝謝。我首先嚐試了這一點,但後來我收到了以下消息:錯誤控制無法離開finally子句的主體 – Rickard

+1

爲什麼將它放在finally塊中?您可以根據您的要求進行評估,也可以在您的catch塊中添加「continue」,並在try-catch結構之後進行評估。這兩個選項意味着跳過最後。 – havardhu

+0

已更新我的原始答案。 –