シンプルな Windows Phone 8 アプリケーションがあります。アプリが起動したら、サーバー呼び出しを行ってユーザーを認証する必要があります。私の WP8 アプリケーションは、InitializePhoneApplication() で、このデータが以前の呼び出しで既に取得され、IsolatedStorage に格納されているかどうかを確認します。IsolatedStorage にデータがない場合は、サーバー呼び出しが実行されます。コード:
if ((IsolatedStorageSettings.ApplicationSettings.Contains("loggedin")) &&
(Convert.ToString(IsolatedStorageSettings.ApplicationSettings["loggedin"]).ToLower() == "y"))
{
RootFrame.Navigate(new Uri("/MainPage.xaml", UriKind.Relative));
}
else
{
SC = new ServiceClient();
SC.CheckDeviceCompleted += SC_CheckDeviceCompleted;
SC.CheckDeviceAsync(Utility.GetStatus());
}
これが SC_CheckDeviceCompleted() のコードです。このイベントは、CheckDeviceAsync() が返されたときに発生します (サービス中)。
private void SC_CheckDeviceCompleted(object sender, CheckDeviceCompletedEventArgs e)
{
string res = e.Result;
if (!res.Equals(""))
{
IsolatedStorageSettings.ApplicationSettings["loggedin"] = "y";
IsolatedStorageSettings.ApplicationSettings["id"] = res;
RootFrame.Navigate(new Uri("/MainPage.xaml", UriKind.Relative));
}
else
{
RootFrame.Navigate(new Uri("/Authentication.xaml", UriKind.Relative));
}
}
サーバーから受信したデータは、アプリケーションの開始ページを選択するために使用されます。空の文字列を受信した場合、サーバーにはデータが登録されていないため、ユーザーはログインする必要があります。それ以外の場合、ユーザーはアプリのメイン ページにすぐにアクセスできます。
問題は、このコードが機能しないことです。具体的には、サーバー呼び出しがサービスから受信されない (サービスが何も受信しない) ため、SC_CheckDeviceCompleted() メソッドが実行されず (サービスから何も受信されないため)、ページが表示されません。
SC インスタンスは、App.xaml.cs の App クラスで public static プロパティとして定義されています。
public static ServiceClient SC { get; set; }
私のサービスは、WP8 アプリケーションの他のページ (App.xaml.cs で定義された ServiceClient プロパティではなく、ローカルの ServiceClient 変数を使用するページ) から呼び出されたときに完全に機能します。App.xaml.cs ファイルで定義されている ServiceClient プロパティを使用して、そのファイルからサービスを呼び出すことができません。なんで?何が問題ですか?