2013-12-19 3 views
12

Я разрабатываю Приложение для Windows Phone 8. В этом приложении мне нужно подключиться к серверу, чтобы получить данные.Как проверить доступность подключения к Интернету в Windows Phone 8 приложение

Так что перед подключением к серверу я хочу проверить, доступно ли подключение к Интернету или нет. Если интернет-соединение доступно, тогда я получу данные с сервера, иначе я покажу сообщение об ошибке.

Пожалуйста, скажите мне, как это сделать в Windows Phone 8.

+0

http://stackoverflow.com/questions/13617017/windows-phone-8-connection-handler-internet-availability Может быть, эта ссылка может помочь вам. –

+0

http://msdn.microsoft.com/en-us/library/system.net.networkinformation.networkinterface(v=vs.110).aspx есть доступный метод GetIsNetworkAvailable – thegiga

+0

Вместо классического метода нет сети проверки (noto само соединение), я бы сделал веб-запрос и посмотрел ответное сообщение. – fillobotto

ответ

7
public static bool checkNetworkConnection() 
{ 
    var ni = NetworkInterface.NetworkInterfaceType; 

    bool IsConnected = false; 
    if ((ni == NetworkInterfaceType.Wireless80211)|| (ni == NetworkInterfaceType.MobileBroadbandCdma)|| (ni == NetworkInterfaceType.MobileBroadbandGsm)) 
     IsConnected= true; 
    else if (ni == NetworkInterfaceType.None) 
     IsConnected= false; 
    return IsConnected; 
} 

вызвать эту функцию и проверить, имеется ли подключение к Интернету или нет.

+1

Не было бы проще проверить, является ли 'ni! = NetworkInterfaceType.None' и возвращает true, и возвращает false в' else'-Statement? –

+5

Это не работает, если вы подключены к Wi-Fi, и сеть не подключена к Интернету. – Roberto

0

Вы можете использовать метод NetworkInterface.GetIsNetworkAvailable(). Он возвращает true, если сетевое соединение доступно и false, если нет. И не забудьте добавить using Microsoft.Phone.Net.NetworkInformation или using System.Net.NetworkInformation, если вы находитесь в PCL.

+0

Это не работает, если вы подключены к Wi-Fi, и сеть не подключена к Интернету. – Roberto

13

NetworkInterface.GetIsNetworkAvailable() возвращает статус сетевых адаптеров.

В зависимости от состояния вы можете спросить, если соединение устанавливается с помощью:

ConnectionProfile -класс Windows Phone 8.1, которая использует enum NetworkConnectivityLevel:

  • None
  • локального доступа
  • Доступ в Интернет

Этот код должен делать трюк.

bool isConnected = NetworkInterface.GetIsNetworkAvailable(); 
if (isConnected) 
{ 
    ConnectionProfile InternetConnectionProfile = NetworkInformation.GetInternetConnectionProfile(); 
    NetworkConnectivityLevel connection = InternetConnectionProfile.GetNetworkConnectivityLevel(); 
    if (connection == NetworkConnectivityLevel.None || connection == NetworkConnectivityLevel.LocalAccess) 
    { 
     isConnected = false; 
    } 
} 
if(!isConnected) 
    await new MessageDialog("No internet connection is avaliable. The full functionality of the app isn't avaliable.").ShowAsync(); 
+0

Это было протестировано только в Windows Phone 8.1, я не знаю, применимо ли оно к более старым версиям WP. – jAC

+2

Я не знаю почему, но в эмуляторе этот метод всегда возвращает true для меня, даже если сеть не настроена на отсутствие сети. –

0

Поскольку этот вопрос появляется в первый результат поиска Google для проверки наличия интернет, я бы поставил ответ на Windows Phone 8.1 XAML также. Это немного разные API, по сравнению с 8

//Get the Internet connection profile 
string connectionProfileInfo = string.Empty; 
try { 
    ConnectionProfile InternetConnectionProfile = NetworkInformation.GetInternetConnectionProfile(); 

    if (InternetConnectionProfile == null) { 
     NotifyUser("Not connected to Internet\n"); 
    } 
    else { 
     connectionProfileInfo = GetConnectionProfile(InternetConnectionProfile); 
     NotifyUser("Internet connection profile = " +connectionProfileInfo); 
    } 
} 
catch (Exception ex) { 
    NotifyUser("Unexpected exception occurred: " + ex.ToString()); 
} 

Для более чтений перейти к MSDN How to retrieve network connection...

0

Вы можете использовать NetworkInformation.GetInternetConnectionProfile получить профиль, который используется в настоящее время, от этого вы можете работать вне связи уровень. Дополнительная информация здесь GetInternetConnectionProfile msdn

Пример того, как вы можете использовать.

private void YourMethod() 
    { 
     if (InternetConnection) { 

      // Your code connecting to server 

     } 
    } 

    public static bool InternetConnection() 
    { 
     return NetworkInformation.GetInternetConnectionProfile().GetNetworkConnectivityLevel() >= NetworkConnectivityLevel.InternetAccess; 
    } 
0

Это, как я это сделал ...

class Internet 
{ 
    static DispatcherTimer dispatcherTimer; 

    public static bool Available = false; 

    public static async void StartChecking() 
    { 
     dispatcherTimer = new DispatcherTimer(); 
     dispatcherTimer.Tick += new EventHandler(IsInternetAvailable1); 
     dispatcherTimer.Interval = new TimeSpan(0, 0, 10); //10 Secconds or Faster 
     await IsInternetAvailable(null, null); 
     dispatcherTimer.Start(); 
    } 

    private static async void IsInternetAvailable1(object sender, EventArgs e) 
    { 
     await IsInternetAvailable(sender, e); 
    } 

    private static async Task IsInternetAvailable(object sender, EventArgs ev) 
    { 
     string url = "https://www.google.com/"; 

     var httpWebRequest = (HttpWebRequest)WebRequest.Create(url); 
     httpWebRequest.ContentType = "text/plain; charset=utf-8"; 
     httpWebRequest.Method = "POST"; 

     using (var stream = await Task.Factory.FromAsync<Stream>(httpWebRequest.BeginGetRequestStream, 
                   httpWebRequest.EndGetRequestStream, null)) 
     { 
      string json = "{ \"302000001\" }"; //Post Anything 

      byte[] jsonAsBytes = Encoding.UTF8.GetBytes(json); 

      await stream.WriteAsync(jsonAsBytes, 0, jsonAsBytes.Length); 

      WebClient hc = new WebClient(); 
      hc.DownloadStringCompleted += (s, e) => 
      { 
       try 
       { 
        if (!string.IsNullOrEmpty(e.Result)) 
        { 
         Available = true; 
        } 
        else 
        { 
         Available = false; 
        } 
       } 
       catch (Exception ex) 
       { 
        if (ex is TargetInvocationException) 
        { 
         Available = false; 
        } 
       } 
      }; 
      hc.DownloadStringAsync(new Uri(url)); 
     } 
    } 

} 

Поскольку Windows Phone 8 не имеет возможности проверить подключение к Интернету, вы должны сделать это, отправив запрос POST HTTP. Вы можете сделать это, отправив его на любой веб-сайт, который вы хотите. Я выбрал google.com. Затем проверьте каждые 10 секунд или менее, чтобы обновить состояние соединения.

0

Может возникнуть некоторая задержка в ответе веб-запроса. Поэтому для некоторых приложений этот метод может быть недостаточно быстрым. Это проверит подключение к Интернету на любом устройстве.Лучше всего проверить, действительно ли порт 80, порт по умолчанию для HTTP-трафика, всегда онлайн-сайта.

public static bool TcpSocketTest() 
    { 
     try 
     { 
      System.Net.Sockets.TcpClient client = 
       new System.Net.Sockets.TcpClient("www.google.com", 80); 
      client.Close(); 
      return true; 
     } 
     catch (System.Exception ex) 
     { 
      return false; 
     } 
    }