2009-05-13 11 views
7

C'è un modo per determinare se un'applicazione XBAP (WPF ospitata in un browser) ha connettività di rete? In caso contrario, in che modo un client Windows tradizionale scritto in C# e .NET determina se ha connettività?Rileva la connettività di rete da un'applicazione WPF/XBAP?

Fondamentalmente il caso d'uso è un'applicazione XBAP in esecuzione su un laptop portatile connesso a una rete intranet via WiFi. Il laptop non avrà una connessione a Internet. La connessione WiFi può essere o non essere lì a seconda di dove si trova l'utente al momento.

+0

Prova questo codice che funziona per me. http://stackoverflow.com/questions/520347/how-do-i-check-for-a-network-connection/38179695#38179695 – Kumar

+0

http://stackoverflow.com/questions/520347/how-do-i- check-for-a-network-connection/38179695 # 38179695 – Kumar

risposta

3

Fate questo in vostro InitializeComponent():

// Add EventHandler for NetworkAddressChanged event  
NetworkChange.NetworkAddressChanged += new NetworkAddressChangedEventHandler(AddressChangedCallback); 

Ecco il metodo che viene chiamato quando che gli incendi di evento:

internal void AddressChangedCallback(object sender, EventArgs e) 
{ 
    // Check for NetworkConnectivity 
    _isInternetConnectionActive = new NetworkConnectivity().IsInternetConnected; 
} 

Qui è la classe NetworkConnectivity:

public class NetworkConnectivity 
{ 
    private List<IPAddress> _ipAddresses = new List<IPAddress>(); 

    public NetworkConnectivity() 
    { 
     _ipAddresses = new List<IPAddress>(); 
    } 

    #region Public Properties 
    public int CountIPAddresses 
    { 
     get { return this.IPAddresses.Count; } 
    } 
    public List<IPAddress> IPAddresses 
    { 
     get 
     { 
      _ipAddresses.Clear(); 
      // Get a listing of all network adapters 
      NetworkInterface[] adapters = NetworkInterface.GetAllNetworkInterfaces(); 
      foreach (NetworkInterface adapter in adapters) 
      { 
       IPInterfaceProperties adapterProperties = adapter.GetIPProperties(); 
       GatewayIPAddressInformationCollection addresses = adapterProperties.GatewayAddresses; 
       // If this adapter has at least 1 IPAddress 
       if (addresses.Count > 0) 
       { 
        // Loop through all IP Addresses 
        foreach (GatewayIPAddressInformation address in addresses) 
        { 
         _ipAddresses.Add(address.Address); 
        } 
       } 
      } 
      return _ipAddresses; 
     } 
    } 
    public bool IsInternetConnected 
    { 
     get 
     { 
      if (this.CountIPAddresses == 0) 
      { 
       return false; 
      } 
      else 
      { 
       //IPAddress[] ips = ResolveDNSAddress("google.com"); 
       //return PingIPAddressPool(ips); 
       return PingIPAddress("72.14.204.104"); // Google IP 
      } 
     } 
    } 
    #endregion 

    #region Public Methods 
    public IPAddress[] ResolveDNSAddress(string UrlAddress) 
    { 
     IPHostEntry hostInfo = Dns.Resolve(UrlAddress); 
     return hostInfo.AddressList; 
    } 
    public bool PingIPAddressPool(IPAddress[] ipAddresses) 
    { 
     foreach (IPAddress ip in ipAddresses) 
     { 
      if (PingIPAddress(ip.Address.ToString())) 
      { 
       return true; 
      } 
     } 
     return false; 
    } 
    public bool PingIPAddress(string ip) 
    { 
     // Pinging 
     IPAddress addr = IPAddress.Parse(ip); 
     Ping pingSender = new Ping(); 
     PingOptions options = new PingOptions(); 

     // Use the default Ttl value which is 128, 
     // but change the fragmentation behavior. 
     options.DontFragment = true; 

     // Create a buffer of 32 bytes of data to be transmitted. 
     string data = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"; 
     byte[] buffer = Encoding.ASCII.GetBytes(data); 
     int timeout = 15; // seconds to wait for response 
     int attempts = 2; // ping attempts 
     for (int i = 0; i < attempts; i++) 
     { 
      PingReply reply = pingSender.Send(addr, timeout, buffer, options); 
      if (reply.Status == IPStatus.Success) 
      { return true; } 
     } 
     return false; 
    } 
    #endregion 

} 
+0

questo codice è buono, ma alcune funzioni come Dns.Resolve() sono obsolete. – Raptor

Problemi correlati