Como verificar a conexão com a Internet com o .NET, C # e WPF

Eu estou usando .NET, C # e WPF, e eu preciso verificar se a conexão está aberta para uma determinada URL, e não consigo fazer nenhum código funcionar que eu encontrei na Internet.

Eu tentei:

Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); try { IAsyncResult result = socket.BeginConnect("localhost/myfolder/", 80, null, null); bool success = result.AsyncWaitHandle.WaitOne(3000, true); if (!success) { MessageBox.Show("Web Service is down!"); } else MessageBox.Show("Everything seems ok"); } finally { socket.Close(); } 

Mas eu sempre recebo a mensagem de que tudo está OK mesmo se eu desligar meu servidor Apache local.

Eu também tentei:

 ing ping = new Ping(); PingReply reply; try { reply = ping.Send("localhost/myfolder/"); if (reply.Status != IPStatus.Success) MessageBox.Show("The Internet connection is down!"); else MessageBox.Show("Seems OK"); } catch (Exception ex) { MessageBox.Show("Error: " + ex.Message); } 

Mas isso sempre dá uma exceção (ping parece funcionar apenas ping no servidor, então localhost funciona, mas localhost / myfolder / doesnt)

Por favor, como verificar a conexão para que funcione para mim?

Muitos desenvolvedores estão resolvendo esse “problema” apenas fazendo ping no Google.com. Bem…? : / Isso funcionará na maioria dos casos (99%), mas o quão profissional é confiar no trabalho da sua aplicação em algum serviço web externo?

Em vez de executar ping no Google.com, há uma function de API do Windows muito interessante chamada InternetGetConnectedState() , que reconhece se você tem access à Internet ou não.

A SOLUÇÃO para esta situação é:

 using System; using System.Runtime; using System.Runtime.InteropServices; public class InternetAvailability {    [DllImport("wininet.dll")]    private extern static bool InternetGetConnectedState(out int description, int reservedValue);    public static bool IsInternetAvailable( )    {        int description;        return InternetGetConnectedState(out description, 0);    } } 

No final, usei meu próprio código:

 private bool CheckConnection(String URL) { try { HttpWebRequest request = (HttpWebRequest)WebRequest.Create(URL); request.Timeout = 5000; request.Credentials = CredentialCache.DefaultNetworkCredentials; HttpWebResponse response = (HttpWebResponse)request.GetResponse(); if (response.StatusCode == HttpStatusCode.OK) return true; else return false; } catch { return false; } } 

Uma coisa interessante é que quando o servidor está inativo (eu desligo meu Apache) não estou recebendo nenhum status HTTP, mas uma exceção é lançada. Mas isso funciona bem o suficiente 🙂

Usa isto:

 private bool CheckConnection() { WebClient client = new WebClient(); try { using (client.OpenRead("http://www.google.com")) { } return true; } catch (WebException) { return false; } } 

Você pode tentar isso;

 private bool CheckNet() { bool stats; if (System.Net.NetworkInformation.NetworkInterface.GetIsNetworkAvailable() == true) { stats = true; } else { stats = false; } return stats; } 

Eu acho que isso será mais preciso quando se trata de aplicativos do Windows, o formulário do Windows ou aplicativos WPF, em vez de usar WebClient ou HttpWebRequest,

 public class InternetChecker { [System.Runtime.InteropServices.DllImport("wininet.dll")] private extern static bool InternetGetConnectedState(out int Description, int ReservedValue); //Creating a function that uses the API function... public static bool IsConnectedToInternet() { int Desc; return InternetGetConnectedState(out Desc, 0); } } 

Enquanto chamando escrever

 if(InternetCheckerCustom.CheckNet()) { // Do Work } else { // Show Error MeassgeBox }