270 votes

Quelle est la meilleure façon de vérifier la connectivité Internet à l'aide de .NET ?

Quel est le moyen le plus rapide et le plus efficace de vérifier la connectivité Internet dans .NET ?

6 votes

Si l'utilisateur dispose d'une connexion internet. Si l'utilisateur peut se connecter à l'internet. Pour envoyer un journal électronique.

14 votes

Il suffit d'envoyer le courriel. Si l'utilisateur n'est pas connecté, vous recevrez probablement une sorte d'exception (que vous devrez probablement gérer de toute façon).

18 votes

Notez également qu'il n'existe aucun moyen de vérifier si l'utilisateur es connectés à l'internet ; tout ce que l'on peut savoir, c'est s'ils sont ont été connectés dans le passé . Supposons que vous ayez une méthode : "bool c = IsConnected() ; if (c) { DoSomething() ; } "entre l'appel à IsConnected et DoSomething, le routeur du réseau sans fil peut avoir été débranché. IsConnected devrait en fait s'appeler WasRecentlyConnected.

336voto

ChaosPandion Points 37025

Vous pouvez utiliser ce code, qui devrait également fonctionner en Iran et en Chine.

public static bool CheckForInternetConnection(int timeoutMs = 10000, string url = null)
{
    try
    {
        url ??= CultureInfo.InstalledUICulture switch
        {
            { Name: var n } when n.StartsWith("fa") => // Iran
                "http://www.aparat.com",
            { Name: var n } when n.StartsWith("zh") => // China
                "http://www.baidu.com",
            _ =>
                "http://www.gstatic.com/generate_204",
        };

        var request = (HttpWebRequest)WebRequest.Create(url);
        request.KeepAlive = false;
        request.Timeout = timeoutMs;
        using (var response = (HttpWebResponse)request.GetResponse())
            return true;
    }
    catch
    {
        return false;
    }
}

21 votes

C'est probablement mieux que d'envoyer un ping à Google, car je pense que nous n'avons aucune garantie que Google continue à répondre aux pings. D'un autre côté, je ne peux pas imaginer un monde où www.google.com ne renvoie pas du HTML :)

5 votes

@Daniel : c'est vrai d'un côté, mais d'un autre côté, le téléchargement du site web est un peu surchargé imo

0 votes

4 Ko, ce n'est pas beaucoup de frais généraux.

97voto

Mef Points 15230

Il n'y a absolument aucune chance que vous puissiez de manière fiable vérifier s'il y a une connexion internet ou non (je suppose que vous voulez dire un accès à l'internet).

Vous pouvez cependant demander des ressources qui ne sont pratiquement jamais hors ligne, comme pinger google.com ou quelque chose de similaire. Je pense que cela serait efficace.

try { 
    Ping myPing = new Ping();
    String host = "google.com";
    byte[] buffer = new byte[32];
    int timeout = 1000;
    PingOptions pingOptions = new PingOptions();
    PingReply reply = myPing.Send(host, timeout, buffer, pingOptions);
    return (reply.Status == IPStatus.Success);
}
catch (Exception) {
    return false;
}

32 votes

+1 "Il n'y a absolument aucun moyen de vérifier de manière fiable s'il y a une connexion internet"

6 votes

Tout ce qu'il fait, c'est vérifier que Google est en ligne au moment où vous l'avez interrogé. Si l'instant d'après votre ping réussi, l'internet tombe en panne, que se passe-t-il ? Il est inutile de vérifier avant d'agir.

13 votes

En quoi cela contredit-il l'affirmation principale de ma réponse ?

45voto

dbasnett Points 4114

Au lieu de vérifier, il suffit d'exécuter l'action (requête web, mail, ftp, etc.) et de se préparer à ce que la requête échoue, ce que vous devez faire de toute façon, même si votre vérification a été couronnée de succès.

Considérez ce qui suit :

1 - check, and it is OK
2 - start to perform action 
3 - network goes down
4 - action fails
5 - lot of good your check did

Si le réseau est en panne, votre action échouera aussi rapidement qu'un ping, etc.

1 - start to perform action
2 - if the net is down(or goes down) the action will fail

10 votes

C'est vrai ! Il suffit de le faire, mais il faut se préparer à toutes les éventualités.

4 votes

Considérons ce qui suit : Vous devez Faire quelque chose si le réseau est hors service pendant une durée x (par exemple, tracelog, réinitialisation du routeur)

3 votes

Ce n'est pas le PO, mais la raison pour laquelle je veux faire cela est d'ÉVITER LE DÉLAI DE 100 SECONDES PAR DÉFAUT si la connectivité Internet n'est pas disponible. La requête HTTP est effectuée sur un thread d'arrière-plan, donc le thread de l'interface utilisateur n'est pas bloqué, mais mon application ne peut pas sortir avant que le thread d'arrière-plan ne revienne de la requête HTTP et ne se termine. Plutôt que d'essayer de trouver un "juste milieu", j'aimerais éviter la requête si je savais que la connexion Internet était coupée.

34voto

Kamran Shahid Points 495

NetworkInterface.GetIsNetworkAvailable est très peu fiable. Il suffit d'avoir une connexion VMware ou une autre connexion LAN pour qu'il renvoie un résultat erroné. De plus, à propos de Dns.GetHostEntry Je me demandais simplement si l'URL de test pouvait être bloquée dans l'environnement où mon application va être déployée.

J'ai donc trouvé un autre moyen d'y parvenir en utilisant InternetGetConnectedState méthode. Mon code est le suivant

[System.Runtime.InteropServices.DllImport("wininet.dll")]
private extern static bool InternetGetConnectedState(out int Description, int ReservedValue);

public static bool CheckNet()
{
     int desc;
     return InternetGetConnectedState(out desc, 0);         
}

0 votes

Lors des tests, j'ai constaté que InternetGetConnectedState renvoyait la valeur true lorsque le lecteur VMWare était installé (internet déconnecté). J'ai dû le désactiver dans le panneau de configuration \Network et Internet \Network Connexions (VMNet1 et VMNet8).

0 votes

Ok Justin Oringer.je l'ai vérifié mais je dois le vérifier à nouveau.

2 votes

C'est la meilleure approche pour moi, je vérifie toujours la connectivité de mon service après cela, puis je lance les routines... Je voulais juste éviter les exceptions.

14voto

Jaime Macias Points 41

Test de connexion à l'internet en envoyant une requête à Google :

new Ping().Send("www.google.com.mx").Status == IPStatus.Success

7 votes

Une description accompagnant cette réponse serait bénéfique pour un plus grand nombre de personnes que l'auteur original de la question.

13 votes

Attention, de nombreuses écoles et bureaux bloquent le protocole ping. C'est idiot, je sais.

0 votes

Je n'arrive pas à trouver la classe ping, pourriez-vous m'aider ? Je travaille sur UWP et les autres moyens de consulter les informations réseau ne fonctionnent pas.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X