0

App.xaml.cs クラスで認証を行いたいのですが、ユーザーがデータベースに存在する場合は、ユーザーをメンバー ページに誘導し、それ以外の場合はユーザーのパブリック ページを誘導します。rootframe ナビゲートの使用方法は知っていますが、問題は、Webervice 非同期メソッドが RootFrameNavigating の前に記述されていても、その前に実行されないことです。私のコードはここにあります

アプリコンストラクターで

        dclient.GetUserByPhoneIdCompleted += new EventHandler<GetUserByPhoneIdCompletedEventArgs> (dclient_GetUserByPhoneIdCompleted);
        dclient.GetUserByPhoneIdAsync(GetDeviceUniqueID());
        if (getUserbyPhoneIdCompleted)
              RootFrame.Navigating += new NavigatingCancelEventHandler(RootFrame_Navigating);

そして私の方法では

        if (e.Uri.ToString().Contains("/MainPage.xaml") != true)
            return;
        e.Cancel = true;

        RootFrame.Dispatcher.BeginInvoke(delegate
        {
            if (userId == -1)
                RootFrame.Navigate(new Uri(string.Format("/View/PublicPage.xaml"), UriKind.Relative));
            else
                RootFrame.Navigate(new Uri(string.Format("/View/WelcomePage.xaml"), UriKind.Relative));
        });

そして、webserviceの私のメソッドでは整数が返され、そこでユーザーIDを取得します

このような

 void dclient_GetUserByPhoneIdCompleted(object sender, GetUserByPhoneIdCompletedEventArgs e)
 {
     userId = e.Result;
     getUserbyPhoneIdCompleted = true; 
 }
4

1 に答える 1

0

アプリケーションが起動したら、Web サービスに非同期呼び出しを送信します。次に、ナビゲート イベントがトリガーされ (なぜそうならないのでしょうか? スレッドをブロックしていません)、イベント ハンドラーが呼び出されます。そこでは、ナビゲーションをキャンセルして、Web サービスから返された値を確認しています。ただし、待機する必要がないため、Web サービスの呼び出しが終了する前にその時点に到達できます。これを修正する方法はたくさんありますが、私が推奨する方法は次のとおりです。

  • アプリケーションの起動時に Web サービスを呼び出さず、アプリケーションがカスタム読み込みページに移動できるようにします
  • そのページで、Web サービスを呼び出し、「読み込み中」メッセージを表示します。
  • Web サービス呼び出しの結果を使用して、必要なページにリダイレクトし、バックスタックから読み込み中のページを削除します

Web サービス呼び出しでエラーが返された場合の処理​​を忘れないでください。

于 2012-05-16T09:22:32.383 に答える