2015-02-16 2 views
1

я использую ниже метод для проверки подключения к Интернету или нет в C# и я использовал его из What is the best way to check for Internet connectivity using .NET?проверка имеется подключение к Интернету или нет в C#

public static bool CheckForInternetConnection() 
    { 
     try 
     { 
      using (var client = new WebClient()) 
      using (var stream = client.OpenRead("http://www.google.com")) 
      { 
       return true; 
      } 
     } 
     catch 
     { 
      return false; 
     } 
    } 

выше метод работает, но я перед проблемой, некоторые время, затрачиваемое на повторное использование, может быть связано с Интернетом, но когда я открываю Google.com в веб-браузере, тогда связь открывается через секунду, так почему это занимает время, чтобы получить результат от C#

+0

Возможно, Google определяет вас как бота и задерживает ответ? – Uriil

+0

Попробуйте установить свойство Proxy для WebClient равным нулю – Bridge

+0

Возможный дубликат [C# WebClient, действующий медленнее в первый раз] (http://stackoverflow.com/questions/4932541/c-sharp-webclient-acting-slow-the- первый раз) – Sinatr

ответ

2

Вы можете проверить доступен ли интернет или нет:

ConnectionProfile internetConnectionProfile = Windows.Networking.Connectivity.NetworkInformation.GetInternetConnectionProfile(); 
      if (internetConnectionProfile == null) 
      { 
       //logic .... 
      } 

      if (internetConnectionProfile != null) 
      { 
       this.IsInternetAvailable = internetConnectionProfile.GetNetworkConnectivityLevel() == 
              NetworkConnectivityLevel.InternetAccess; 

       if (internetConnectionProfile.NetworkAdapter.IanaInterfaceType != 71)// Connection is not a Wi-Fi connection. 
       { 
        var isRoaming = internetConnectionProfile.GetConnectionCost().Roaming; 

        //user is Low on Data package only send low data. 
        var isLowOnData = internetConnectionProfile.GetConnectionCost().ApproachingDataLimit; 

        //User is over limit do not send data 
        var isOverDataLimit = internetConnectionProfile.GetConnectionCost().OverDataLimit; 
        IsWifiConnected = true; 

       } 
       else //Connection is a Wi-Fi connection. Data restrictions are not necessary. 
       { 
        IsWifiConnected = true; 

       } 
      } 
+0

Хотя это был бы мой предпочтительный метод проверки подключения к Интернету, нужно сказать, что это поддерживается только с Windows 8 и выше. Подробнее: [MSDN] (https://msdn.microsoft.com/en-us/library/windows/apps/windows.networking.connectivity.networkinformation.getinternetconnectionprofile) –

0
public static bool ConnectionTest() 
    { 
     try 
     { 
      string site = "http://www.google.com/"; 
      TcpClient client = TcpClient(site, 80); 
      client.Close(); 
      return true; 
     } 
     catch (Exception) 
     { 
      return false; 
     } 
    } 

Нечто подобное должно быть быстрее.

0

Я думаю, что ваш TimeOut не работает из-за разрешения имени домена. Я являюсь прокси-сервером, поэтому вы должны настроить его в файле app.config.

Проверьте этот пример, надеюсь, он вам поможет. Я сделал это с помощью .Net 4.0.

static bool CheckForInternetConnection(int timeOut = 3000) 
    { 
     var task = CheckForInternetConnectionTask(timeOut); 

     return task.Wait(timeOut) && task.Result; 
    } 

    static Task<bool> CheckForInternetConnectionTask(int timeOut = 3000) 
    { 
     return Task.Factory.StartNew 
      (() => 
      { 
       try 
       { 
        var client = (HttpWebRequest) WebRequest.Create("http://google.com/"); 
        client.Method = "HEAD"; 
        client.Timeout = timeOut; 

        using (var response = client.GetResponse()) 
        using (response.GetResponseStream()) 
        { 
         return true; 
        } 
       } 
       catch 
       { 
        return false; 
       } 
      }); 
    } 

И вызов пример:

Console.WriteLine("CheckForInternetConnection -> {0}", CheckForInternetConnection()); 

Если вы прокси позади, не забудьте добавить конфигурацию прокси-сервера на app.config файла.

<?xml version="1.0" encoding="utf-8" ?> 
<configuration> 
    <system.net> 
    <defaultProxy enabled="true"> 
     <proxy proxyaddress="http://127.0.0.1:1111" usesystemdefault="True"/> 
    </defaultProxy> 
    </system.net> 
</configuration> 
Смежные вопросы