Around and About .NET World

Il blog di Marco Minerva
posts - 1671, comments - 2232, trackbacks - 2135

My Links

News

Contattami su Live Messenger:


MCTS: Windows, Web, Distributed Applications & SQL Server

MCPD: Enterprise Applications

Tag Cloud

Archives

Post Categories

Links

Determinare quando è disponibile una connessione a Internet

Ormai sono lanciato nella realizzazione di classi di supporto per la gestione della rete. Dopo NetworkChange2, oggi è la volta di una classe che consente di sapere se il PC è collegato a Internet oppure no, nonché di ricevere notifiche se lo stato della connessione cambia:

1 using System; 2 using System.ComponentModel; 3 using System.Threading; 4 using System.Net; 5 6 namespace System.Net.NetworkInformation 7 { 8 public delegate void InternetAvailabilityChangedEventHandler(object sender, InternetAvailabilityEventArgs e); 9 10 public static class NetworkMonitor 11 { 12 private const string HOST = "http://www.microsoft.com"; 13 14 private static AsyncOperation operation; 15 private static SendOrPostCallback internetAvailabilityCallback; 16 private static bool internetAvailable; 17 18 private static Timer checkConnection; 19 private const int CHECK_CONNECTION_TIMEOUT = 5000; 20 21 public static event InternetAvailabilityChangedEventHandler InternetAvailabilityChanged; 22 23 static NetworkMonitor() 24 { 25 internetAvailable = false; 26 27 operation = AsyncOperationManager.CreateOperation(null); 28 internetAvailabilityCallback = new SendOrPostCallback(InternetAvailabilityHandler); 29 30 //Attiva il timer che controlla la disponibilità della connessione. 31 checkConnection = new Timer(new TimerCallback(IsConnectionAvailable), null, 1, CHECK_CONNECTION_TIMEOUT); 32 } 33 34 public static bool IsConnectionAvailable() 35 { 36 HttpWebRequest request = null; 37 HttpWebResponse response = null; 38 bool isAvailable = false; 39 40 try 41 { 42 request = (HttpWebRequest)HttpWebRequest.Create(HOST); 43 response = (HttpWebResponse)request.GetResponse(); 44 45 if (response.StatusCode == HttpStatusCode.OK) 46 { 47 // HTTP = 200 - Internet connection available, server online 48 isAvailable = true; 49 } 50 } 51 catch (WebException) 52 { } 53 finally 54 { 55 try 56 { 57 if (response != null) 58 response.Close(); 59 } 60 catch { } 61 } 62 63 return isAvailable; 64 } 65 66 private static void IsConnectionAvailable(object stateInfo) 67 { 68 checkConnection.Change(Timeout.Infinite, Timeout.Infinite); 69 70 bool isAvailable = IsConnectionAvailable(); 71 if (isAvailable != internetAvailable) 72 { 73 internetAvailable = isAvailable; 74 operation.Post(internetAvailabilityCallback, new InternetAvailabilityEventArgs(isAvailable)); 75 } 76 77 checkConnection.Change(CHECK_CONNECTION_TIMEOUT, CHECK_CONNECTION_TIMEOUT); 78 } 79 80 private static void InternetAvailabilityHandler(object stateInfo) 81 { 82 if (InternetAvailabilityChanged != null) 83 InternetAvailabilityChanged(null, (InternetAvailabilityEventArgs)stateInfo); 84 } 85 } 86 87 public class InternetAvailabilityEventArgs : EventArgs 88 { 89 private bool isAvailable; 90 public bool IsAvailable 91 { 92 get { return isAvailable; } 93 } 94 95 public InternetAvailabilityEventArgs(bool isAvailable) 96 { 97 this.isAvailable = isAvailable; 98 } 99 } 100 }

In estrema sintesi, questa classe cerca di effettuare una richiesta HTTP (righe 42-43) e, in base al messaggio di risposta, determina se la connessione al Web è disponibile oppure no. Questo non è l'unico metodo possibile, ad esempio un'alternativa si basa sull'utilizzo dell'API di Windows InternetGetConnectedState, ma dove possibile preferisco rimanere nel "mondo managed".

Technorati Tag: ,,

Print | posted on sabato 29 dicembre 2007 16:31 | Filed Under [ C# ]

Comments have been closed on this topic.

Powered by:
Powered By Subtext Powered By ASP.NET