網絡故障(network failure)是指由于硬件的問題、軟件的漏洞、病毒的侵入等引起網絡無法提供正常服務或降低服務質量的狀態。 如今,桌面程序不再像以前那樣完全獨立于網絡,并且各種功能都與Internet連接密不可分。程序通常需要Internet連接來執行諸如自動更新,WebService調用等操作以訪問遠程數據,但是在實際訪問遠程數據之前,我們最好確保遠程連接可用,以便程序的過程和健壯性程序可以是很了不起的。通過編程方式動態檢測Internet連接非常耗時,因此,如果不使用多線程,則程序接口將在檢測期間死鎖,并且檢測連接占用了主線程的所有操作。當檢測到遠程連接是否可用時,主界面經常死鎖,并不是良好的用戶體驗。在本文中,我們將為這個問題創建一個C#組件。主要目標是創建一個用于測試遠程連接的標準框架。該測試必須是多線程的,并且必須在后臺執行。成功檢測到連接后,必須通知它。主線程會對連接可用的情況做出反應,例如打開網頁,開始自動更新以及開始調用WebService。 在開始之前,我們需要列出項目需要使用的相關技術。 在檢測Internet連接的方法中,我們采用了不同的策略。可以想象,任何客戶端程序在需要連接到Internet時都必須具有一個地址。該地址不過是一個IP地址或域名和端口數據。客戶端程序通過該地址與遠程主機建立連接以進行數據交換。然后,我們的客戶端程序將直接檢測該地址是否可用,以近似估算Internet連接是否可用。地址可用性證明Internet連接也可用,而地址不可用性證明兩點:1、地址無效; 2、 Internet連接不可用。但是地址無效的可能性很小。首先,程序員不可能為客戶端程序提供一個無效的地址來嘗試連接,然后服務器端癱瘓的可能性就很小,例如嘗試連接或。 好的,讓我們開始創建檢測組件。 首先我們創建一個Windows窗體應用程序,然后添加一個組件,這些過程將不再詳述。我們將新組件命名為InternetConnection,首先定義兩個私有字段:BackgroundWorker類型的bgworker和字符串類型的可靠的URL。然后定義兩個屬性: 1 public string ReliableURL ReliableURL屬性是我們前面提到的所謂的遠程地址。我們通過訪問可靠的地址或我們自己的Web服務地址來間接檢查Internet連接是否可用。 Active屬性允許控制BackgroundWorker的異步執行狀態,并且通過將該組件的Active屬性設置為true來啟動后臺Internet連接檢測。 接下來,我們需要定義事件。為了簡單起見,我們為此組件定義了兩個事件Connected和ConnectFailure。前者是成功連接后觸發的事件,后者是由于連接失敗觸發的事件。我們的事件不需要傳遞參數。有關事件的更多詳細信息,請參閱我的另一篇博客文章:.Net事件和代表。 1 public event EventHandler Connected; 接下來,我們創建代碼以檢測連接。有關使用BackgroundWorker的更多方法,請參閱MSDN或我的另一篇博客文章:實用.Net多線程(三)和實用.Net多線程(四))。 1 private void BackgroundWorker_DoWork(object sender, DoWorkEventArgs e) 1 private void BackgroundWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) 最后,在組件的初始化方法中實例化相關的私有字段。 1 public InternetConnection(IContainer container) 創建組件后,編譯整個解決方案,打開最初創建的項目WindowsFormsApplication1的Form1窗體,我們將在VS IDE的工具箱中找到剛創建的名為InternetConnection的組件,并將其拖到Form1上。窗體中,有一個類型為internetConnection1的實例。我們在窗體上放置一個Button,一個WebBrowser和一個StatusStrip,并將StatusLabel添加到StatusStrip。我們使用WebBrowser來顯示特定的網頁,以指示Internet連接可用。 選擇internetConnection1,我們將發現它暴露了兩個事件,我們為這兩個事件添加了相應的處理代碼: 1 private void internetConnection1_Connected(object sender, EventArgs e) 連接成功后,將顯示一個遠程網頁,并在失敗時顯示一個自定義的HTML文件。如下圖所示: 將相應的代碼添加到WebBrowser的DocumentCompleted事件中,以響應網頁加載的完成: 1 private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e) 最后,在Button的click事件中添加代碼以啟動測試連接: 1 private void button1_Click(object sender, EventArgs e) 此時,已創建了一個自定義Internet連接組件。該程序已在Windows SP3 + Visual Studio 2008 SP1的環境下成功編譯和調試。
當今,越來越多的業務應用運行于網絡架構之上,保障網絡的持續、高效、安全的運行,成為網絡管理者面臨的巨大挑戰。 |
溫馨提示:喜歡本站的話,請收藏一下本站!