我有这个用于阅读网络订阅源的WP7应用程序。我正在使用Async CTP下载源,在本地保存并使用它们,因此我可以离线使用App。
当我连接到wifi或手机时,一切都很好用。但是当我离线时,应用程序因错误开始崩溃:
远程服务器返回错误:NotFound。
调用堆栈位置:
AsyncCTPLibrary_Phone.dll!System.Runtime.CompilerServices.AsyncVoidMethodBulder.SetException.AnonymousMethod_2(对象 状态)
堆栈跟踪:
在System.Net.Browser.AsyncHelper.BeginOnUI(SendOrPostCallback) beginMethod,Object state)at System.Net.Browser.ClientHttpWebRequest.EndGetResponse(IAsyncResult的 asyncResult)在System.Net.WebClient.GetWebResponse(WebRequest 请求,IAsyncResult结果)at System.Net.WebClient.DownloadBitsResponseCallback(IAsyncResult结果) 在 System.Net.Browser.ClientHttpWebRequest<> C_ DisplayClassa.b _8(对象 state2)at System.Threading.ThreadPool.WorkItem.WaitCallback_Context(对象 System.Threading.ExecutionContext.Run(ExecutionContext。) executionContext,ContextCallback回调,对象状态)at System.Threading.ThreadPool.WorkItem.doWork(Object o)at System.Threading.Timer.ring()
知道为什么吗?我不会自动降低任何东西......
编辑:这是代码的开始部分,我真的试图避免在我离线时调用Web客户端:
private void MainPage_Loaded(object sender, RoutedEventArgs e)
{
MainPage_Init();
}
private async void MainPage_Init()
{
string isConfig = await Load_Config("");
if (isLoaded == false)
{
if (RSS.Parameters.AutoUpdate == "On")
{
string isDataOk = await Refresh_data();
Refresh_ui();
}
else
{
Refresh_ui();
}
isLoaded = true;
}
}
async Task<string> Load_Config(string force)
{
if (!DeviceNetworkInformation.IsNetworkAvailable)
{
MessageBox.Show(RSS.Parameters.MessageNetwork);
//Load Config from IsoStore
return "No Network";
}
else
{
string data = await new WebClient().DownloadStringTaskAsync(url);
return await GetConfig_Save_Local_XML_Async(data);
//Load Config from Web, Save to IsoStore
}
}
private async Task<string> Refresh_data() //load feeds form Internet and save them to IsoStore
{
IsolatedStorageSettings isoStorage = IsolatedStorageSettings.ApplicationSettings;
if (!DeviceNetworkInformation.IsNetworkAvailable)
{
ProgressBarSwitch("off");
MessageBox.Show(RSS.Parameters.MessageNetwork);
}
else
{
foreach (RSSFeedInfo sfi in RSS.Parameters.FeedsInfo)
{
await Load_Web_XML(new Uri(sfi.Web_XML), sfi.Local_XML);
}
isoStorage["SettingsLastUpdate"] = System.DateTime.Now;
isoStorage.Save();
ProgressBarSwitch("off");
}
return "ok";
}
private void Refresh_ui() //load feeds from IsoStore
{
//use local data
}
答案 0 :(得分:0)
您应该始终围绕网络代码try
/ catch
。有很多可能的错误条件,其中离线只有一个。
例如,如果您连接到没有互联网的本地WiFi,IsNetworkAvailable
将返回true
,即使无法访问互联网。
答案 1 :(得分:0)
查看this article from MSDN,即使没有任何基础服务连接,IsNetworkAvailable
也可以返回true
:
所以有些代码如下:
private void button1_Click(object sender, RoutedEventArgs e){
var sb = new StringBuilder();
sb.Append("Network available: ");
sb.AppendLine(DeviceNetworkInformation.IsNetworkAvailable.ToString());
sb.Append("Cellular enabled: ");
sb.AppendLine(DeviceNetworkInformation.IsCellularDataEnabled.ToString());
sb.Append("Roaming enabled: ");
sb.AppendLine(DeviceNetworkInformation.IsCellularDataRoamingEnabled.ToString());
sb.Append("Wi-Fi enabled: ");
sb.AppendLine(DeviceNetworkInformation.IsWiFiEnabled.ToString());
MessageBox.Show(sb.ToString());}
可以按以下方式为您提供输出: