2014-07-09 8 views
5

Ho un'applicazione che è stata scritta per i camion remoti da utilizzare sul servizio di cella. Prima di fare qualsiasi cosa, sto controllando internet con questa classe:test di connessione a Internet su una rete cellulare

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 alcuni casi, la luce sul dispositivo cellulare esterno ha una luce verde come se ha internet. La mia classe di test torna falsa, quindi pensa che non abbia internet.

Il driver può quindi aprire Internet Explorer, chiudere Internet Explorer, eseguire immediatamente la mia domanda e supera il test di cui sopra.

Gli utenti dicono che IE sta "svegliando" Internet per trasferirlo.

La mia classe non fa essenzialmente la stessa cosa? In caso contrario, come posso "svegliare" la connessione Internet come fa IE?

+0

solo una teoria, ma forse legate proprio DNS. Non sei riuscito a risolvere www.google.com e il servizio DNSCache ha memorizzato questo risultato in modo che continui a non funzionare anche quando dovrebbe funzionare, fino a quando qualcosa non dà un calcio al servizio. È possibile disabilitare DNSCache o testare la connettività Internet utilizzando solo indirizzi IP, ad esempio è possibile eseguire il ping 8.8.8.8. – Havenard

+0

Ecco un'altra soluzione: http://social.msdn.microsoft.com/forums/en-US/7eda3979-6424-4702-89f4-1f586b613b01/flush-dns-cache – Havenard

risposta

1

Non hai specificato se sei limitato a un determinato sistema operativo mobile ma funziona su una normale casella. Provo a sfruttare due funzionalità dello spazio dei nomi System.Net.NetworkInformation.

Inizio con la registrazione per NetworkChangedEvent. Chiamando GetIsNetworkAvailable si ha un'idea se è presente almeno un'altra NIC che non è l'interfaccia di loopback.

Se non c'è connessione, provo a riattivare il livello di rete ottenendo il ping di un host. Uso lo Dns.GetHostEntry per ottenere tutti gli indirizzi IP noti per un host. Quindi provo a Ping l'indirizzo uno per uno.

Si noti che non tutti gli host consentono il traffico ICMP che comporterebbe un timeout in tutte le circostanze. Se però nel frattempo la rete diventa disponibile l'evento NetworkChanged avrebbe dovuto essere licenziato e impostare il HasConnection 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

Darò uno scatto, grazie per le informazioni! – ErocM