Silverlight WP7检查互联网是否可用
我的应用程序WP7未被接受,因为如果互联网不可用,它将无法加载。我想办法检查一下,发现了这个命令Silverlight WP7检查互联网是否可用,silverlight,windows-phone-7,Silverlight,Windows Phone 7,我的应用程序WP7未被接受,因为如果互联网不可用,它将无法加载。我想办法检查一下,发现了这个命令 NetworkInterface.GetIsNetworkAvailable() 但是它不能在模拟器上工作,我也没有任何设备来测试它。 有人能告诉我如果设备处于飞行模式,它是否返回false吗?如果没有,我如何检查它 谢谢, 奥斯卡 编辑:我还尝试了以下代码: try { wsClient.CurrenciesCompleted += new EventHandler<Currency
NetworkInterface.GetIsNetworkAvailable()
但是它不能在模拟器上工作,我也没有任何设备来测试它。
有人能告诉我如果设备处于飞行模式,它是否返回false吗?如果没有,我如何检查它
谢谢,
奥斯卡
编辑:我还尝试了以下代码:
try
{
wsClient.CurrenciesCompleted += new EventHandler<CurrencyConversion.CurrenciesCompletedEventArgs>(wsClient_CurrenciesCompleted);
wsClient.CurrenciesAsync(null);
}
catch
{
NetworkNotAvailable();
}
试试看
{
wsClient.currencescompleted+=新事件处理程序(wsClient\u currencescompleted);
wsClient.currenceasync(空);
}
抓住
{
NetworkNotAvailable();
}
但我无法捕捉到异常,我也尝试了wsClient\u currencescompleted方法,但也没有效果
我在哪里可以测试它?不要测试“一般的互联网”——测试您实际连接的服务。通过尝试连接到it来测试—在启动时提出一些简单、无损的请求。是的,这将占用用户的一小部分数据空间,但是:
- 您将预热网络堆栈并建立一个连接,该连接最终将自动保持活动状态,因此未来的延迟将减少
- 您可以警告用户,如果连接失败,他们的功能可能会受到限制
GetIsNetworkAvailable()
将在模拟器中始终返回true。为了在模拟器中进行测试,您需要在代码中解决这个问题
这可能是一个有用的快速检查,但您还需要(正如Jon指出的)处理无法连接到特定服务器的情况
当您尝试在回调中获取响应时,可以通过捕获WebException来处理此问题
private static void DownloadInfoCallback(IAsyncResult asynchronousResult)
{
try
{
var webRequest = (HttpWebRequest)asynchronousResult.AsyncState;
// This will cause an error if the request failed
var webResponse = (HttpWebResponse)webRequest.EndGetResponse(asynchronousResult);
.....
}
catch (WebException exc)
{
// Handle error here
}
}
乔恩建议的另一种选择是检查哪个网络接口可用。如果您需要根据网络速度调整所调用的服务,这将非常方便。例如,可以修改下面的switch语句以返回表示网络质量的枚举
public class NetworkMonitorClass
{
private Timer timer;
private NetworkInterfaceType _currNetType = null;
private volatile bool _valueRetrieved = false;
public NetworkMonitorClass()
{
//using a timer to poll the network type.
timer = new Timer(new TimerCallBack((o)=>
{
//Copied comment from Microsoft Example:
// Checking the network type is not instantaneous
// so it is advised to always do it on a background thread.
_currNetType = Microsoft.Phone.Net.NetworkInformation.NetworkInterface.NetworkInterfaceType;
_valueRetrieved = true;
}), null, 200, 3000); // update the network type every 3 seconds.
}
public NetworkInterfaceType CurrentNetworkType
{
get
{
if(false == _valueRetrieved ) return NetworkInterfaceType.Unknown;
return _currNetType;
}
private set { ;}
}
public bool isNetworkReady()
{
if(false == _valueRetrieved ) return false;
switch (_currentNetworkType)
{
//Low speed networks
case NetworkInterfaceType.MobileBroadbandCdma:
case NetworkInterfaceType.MobileBroadbandGsm:
return true;
//High speed networks
case NetworkInterfaceType.Wireless80211:
case NetworkInterfaceType.Ethernet:
return true;
//No Network
case NetworkInterfaceType.None:
default:
return false;
}
}
}
请参阅GetIsNetworkAvailable()在设备上正常工作
您可以使用Microsoft.Devices.Environment.DeviceType在仿真器中模拟对此的处理以进行测试
我倾向于通过异常处理来测试互联网的可用性和网站的可用性,并向应用程序用户提供反馈,指出功能不可用的真正原因。这是个好主意,但我该怎么做呢?因为如果我使用问题中编辑的代码,我无法捕获引发的异常:(我该在哪里接?谢谢,Oscar@Oscar:您已经说过要异步执行此操作…因此我希望在不同的线程中报告错误。如果不知道有关客户端的详细信息,就无法说明如何处理错误。我希望有某种方法可以注册错误条件的事件处理程序或som事情是这样的。刚刚发现:在silverlight中,您可以检查回调中的e.错误以处理异常:)tnks!@Oscar您从哪里获得
e.错误?@Matt在我的回调方法中(wsClient\u currencescompleted),在eventArgs中。有一个Result属性,您可以从中获取结果和错误,该属性存储一个异常:),它会在设备中返回false吗?@Oscar Yes。刚刚在设备上验证过。请注意,即使在飞行模式下,如果连接到PC,设备仍将返回true。啊,好的,但即使PC没有连接,它也会返回true?这对开发人员来说有点困惑,我认为好像它只是“有时”起作用。或者我对这种方法的想法是错误的吗?因为仿真器是作为虚拟机运行的,我会假设它总是能够检测到与主机PC的连接。对于栓系电话也是如此,因为它总是与栓系到的机器有连接。这种方法只是检测任何类型的可用网络连接。是的,我找到了这段代码,还找到了使用GetIsNetworkAvailable的代码。我必须说,我没有测试您编写的一个,因为我使用的是模拟器,所以我认为如果GetIsNetworkAvailable不起作用,这也不会起作用。但这是一个非常好的代码,以防需要这种“适应”,tks!