2009-05-13 10 views
7

Gibt es eine Möglichkeit festzustellen, ob eine XBAP (WPF gehostet in einem Browser) Anwendung Netzwerkkonnektivität hat? Wenn nicht, wie würde ein herkömmlicher Windows-Client, der in C# und .NET geschrieben wurde, feststellen, ob er über Konnektivität verfügt?Netzwerkverbindung von einer WPF/XBAP-Anwendung erkennen?

Grundsätzlich ist der Anwendungsfall eine XBAP-Anwendung, die auf einem mobilen Laptop ausgeführt wird, der über WiFi mit einem Intranet verbunden ist. Der Laptop hat keine Verbindung zum Internet. Die WiFi-Verbindung kann oder kann nicht dort sein, abhängig davon, wo sich der Benutzer gerade befindet.

+0

Versuchen Sie diesen Code, der für mich arbeitet. http://stackoverflow.com/questions/520347/how-do-i-check-for-a-network-connection/38179695#38179695 – Kumar

+0

http://stackoverflow.com/questions/520347/how-doi-i- Check-for-a-Netzwerk-Verbindung/38179695 # 38179695 – Kumar

Antwort

3

Tun Sie dies in Ihrem InitializeComponent():

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

Hier ist die Methode, die aufgerufen wird, wenn das Ereignis ausgelöst:

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

Hier ist die NetworkConnectivity Klasse:

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

Dieser Code ist gut, aber einige Funktionen wie Dns.Resolve() sind veraltet. – Raptor

Verwandte Themen