2014-07-09 9 views
5

Ich habe eine Anwendung, die für Remote-Trucks für den Zellendienst geschrieben wurde. Bevor ich etwas tun, bin Überprüfung ich das Internet mit dieser Klasse:testing internet connection in einem Mobilfunknetz

using System.Net; 

namespace SSS.ServicesConfig.MiscClasses 
{ 
    public class VerifyInternetAccess 
    { 
    public static bool HasInternet() 
    { 
     try 
     { 
     using (var client = new WebClient()) 
     using (var stream = client.OpenRead("http://www.google.com")) 
     { 
      return true; 
     } 
     } 
     catch 
     { 
     return false; 
     } 
    } 
    } 
} 

In einigen Fällen hat das Licht auf dem externen Mobilgerät ein grünes Licht, als ob es Internet hat. Meine Testklasse kommt falsch zurück und denkt, dass sie kein Internet hat.

Der Treiber kann dann Internet Explorer öffnen, Internet Explorer schließen, sofort meine Anwendung ausführen und es besteht den obigen Test.

Die Benutzer sagen, dass IE "wacht" das Internet, so dass es übertragen kann.

Taugt meine Klasse im Wesentlichen nicht die gleiche Sache? Wenn nicht, wie kann ich die Internet-Verbindung "aufwachen", wie IE?

+0

nur eine Theorie entlassen und festgelegt wurde, aber vielleicht seine DNS verwendet. Sie haben es nicht geschafft, www.google.com aufzulösen, und der DNSCache-Dienst merkte sich dieses Ergebnis, sodass es auch dann noch fehlschlägt, wenn es funktionieren sollte, bis etwas dem Dienst einen Kick gibt. Sie können DNSCache entweder deaktivieren oder Ihre Internetkonnektivität nur mit IP-Adressen testen, z. B. mit Ping 8.8.8.8. – Havenard

+0

Hier ist eine andere Lösung: http://social.msdn.microsoft.com/forums/en-US/7eda3979-6424-4702-89f4-1f586b613b01/flush-dns-cache – Havenard

Antwort

1

Sie haben nicht angegeben, ob Sie auf ein bestimmtes mobiles Betriebssystem beschränkt sind, aber dies funktioniert auf einer normalen Box. Ich versuche, zwei Funktionen des Namespace System.Net.NetworkInformation zu nutzen.

Ich beginne mit der Registrierung für die NetworkChangedEvent. Wenn Sie GetIsNetworkAvailable aufrufen, erhalten Sie eine Idee, wenn mindestens eine andere NIC vorhanden ist, die nicht die Loopback-Schnittstelle ist.

Wenn keine Verbindung besteht, versuche ich die Netzwerkschicht zu wecken, indem ich einen Host anpinge. Ich verwende die Dns.GetHostEntry, um alle IP-Adressen zu erhalten, die für einen Host bekannt sind. Als nächstes versuche ich Ping die Adresse nacheinander.

Beachten Sie, dass nicht alle Hosts ICMP-Datenverkehr zulassen, der unter allen Umständen zu Zeitüberschreitungen führen würde. Wenn jedoch in der Zwischenzeit das Netzwerk der NetworkChanged Veranstaltung wird sollte die HasConnection auf true

public class VerifyInternetAccess 
{ 
    private static bool HasConnection = false; 
    static VerifyInternetAccess() 
    { 
     NetworkChange.NetworkAvailabilityChanged += (o, ca) => 
      { 
       HasConnection = ca.IsAvailable; 
      }; 

     HasConnection = NetworkInterface.GetIsNetworkAvailable(); 
    } 

    public static bool HasInternet() 
    { 
     bool hasEnded = false; 
     if (!HasConnection) 
     { 
      // let's try to wake up... 
      using (var ping = new Ping()) 
      { 
       var iphost = Dns.GetHostEntry("www.google.com"); 

       foreach (var addr in iphost.AddressList) 
       { 
        var reply = ping.Send(addr); 
        if (reply.Status == IPStatus.Success) 
        { 
         HasConnection = true; 
         break; 
        } 
       } 
      } 
     } 
     return HasConnection; 
    } 
} 
+0

Ich gebe diesem einen Schuss, danke für die Info! – ErocM