我正在开发Windows Phone 8 应用程序。在这个应用程序中,我必须连接到服务器才能获取数据。
所以在连接到服务器之前,我想检查设备的互联网连接是否可用。如果互联网连接可用,那么只有我会从服务器获取数据,否则我会显示错误消息。
请告诉我如何在 Windows Phone 8 中执行此操作。
我正在开发Windows Phone 8 应用程序。在这个应用程序中,我必须连接到服务器才能获取数据。
所以在连接到服务器之前,我想检查设备的互联网连接是否可用。如果互联网连接可用,那么只有我会从服务器获取数据,否则我会显示错误消息。
请告诉我如何在 Windows Phone 8 中执行此操作。
NetworkInterface.GetIsNetworkAvailable()
返回 NIC 的状态。
根据状态,您可以使用以下命令询问是否已建立连接:
ConnectionProfile
-Windows Phone 8.1 的类别,它使用enum NetworkConnectivityLevel
:
这段代码应该可以解决问题。
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();
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;
}
调用此函数并检查互联网连接是否可用。
由于这个问题出现在谷歌搜索检查互联网可用性的第一个结果中,所以我也会给出 windows phone 8.1 XAML 的答案。与 8 相比,它的 API 略有不同。
//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 如何检索网络连接...
你可以使用NetworkInterface.GetIsNetworkAvailable()
方法。如果网络连接可用,则返回 true,否则返回 false。using Microsoft.Phone.Net.NetworkInformation
如果using System.Net.NetworkInformation
您在 PCL 中,请不要忘记添加。
您可以使用NetworkInformation.GetInternetConnectionProfile
获取当前正在使用的配置文件,从中您可以计算出连接级别。此处获取更多信息GetInternetConnectionProfile msdn
您可能如何使用的示例。
private void YourMethod()
{
if (InternetConnection) {
// Your code connecting to server
}
}
public static bool InternetConnection()
{
return NetworkInformation.GetInternetConnectionProfile().GetNetworkConnectivityLevel() >= NetworkConnectivityLevel.InternetAccess;
}
我就是这样做的...
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 秒或更短时间检查一次以刷新连接状态。
Web 请求的响应可能会有一些延迟。因此,对于某些应用程序,此方法可能不够快。这将检查任何设备上的互联网连接。更好的方法是检查端口 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;
}
}