1

Web フィードを読み取るためのこの WP7 アプリケーションがあります。フィードをダウンロードし、ローカルに保存して使用するために Async CTP を使用しているため、App をオフラインで使用できます。

Wi-Fi またはセルラーに接続しているときは、すべてうまく機能します。しかし、私がオフラインのとき、エラーで開始時にアプリケーションがクラッシュします:

リモート サーバーがエラーを返しました: NotFound。

コール スタックの場所:

AsyncCTPLibrary_Phone.dll!System.Runtime.CompilerServices.AsyncVoidMethodBulder.SetException.AnonymousMethod_2(オブジェクトの状態)

スタックトレース:

System.Net.Browser.AsyncHelper.BeginOnUI (SendOrPostCallback beginMethod、オブジェクト状態) で System.Net.Browser.ClientHttpWebRequest.EndGetResponse (IAsyncResult asyncResult) で System.Net.WebClient.GetWebResponse (WebRequest 要求、IAsyncResult 結果) で System.Net .WebClient.DownloadBitsResponseCallback(IAsyncResult 結果) で System.Net.Browser.ClientHttpWebRequest.<> c_DisplayClassa.b _8 (オブジェクト状態 2) (ExecutionContext executionContext、ContextCallback コールバック、オブジェクト状態) System.Threading.ThreadPool.WorkItem.doWork(Object o) で 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
 }
4

2 に答える 2

0

ネットワーク コードの周りには常にtry/が必要です。catch考えられるエラー状態は多数ありますが、オフラインはそのうちの 1 つにすぎません。

たとえば、インターネットなしでローカル WiFi に接続している場合、インターネット アクセスがない場合でも、IsNetworkAvailableは を返します。true

于 2012-08-03T11:30:15.600 に答える
0

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());}

次の行に沿って出力を提供できます。

  • 利用可能なネットワーク: True
  • セルラー対応: False
  • ローミング有効: False
  • Wi-Fi 有効: False
于 2012-08-03T13:13:19.127 に答える