0

アプリケーションでのログインを実現しようとしています。ページの読み込みを開始する前にログインする必要があります。これを行うには、WMAppManifest を次のように設定します。

<DefaultTask Name="_default" NavigationPage="" />

そして、非同期メソッドを実行すると、並列アプリケーションの読み込みページが開始されますが、空であるため、アプリケーションがフリーズします。

Application_Launching の外観:

private async void Application_Launching(object sender, LaunchingEventArgs e)
{
   bool logged = await LogIn("login", "pass");

   Uri nUri = null;
   if (logged)
   {
       nUri = new Uri("/SecondPage.xaml", UriKind.Relative);
   }
   else
   {
       nUri = new Uri("/FirstPage.xaml", UriKind.Relative);
   }

   ((App)Application.Current).RootFrame.Navigate(nUri);

}

非同期メソッドのログイン:

private async Task<bool> LogIn(string login, string password)
{
    string str_login_number = login;
    string str_login_pass = password;


    JObject jo = new JObject();
    jo.Add("number", str_login_number);
    jo.Add("pass", str_login_pass);


    JsonWorker jWorker = new JsonWorker();
    var response = await jWorker.sendJSON("url", jo);
    string str_responseformjson = await jWorker.getJSON(response);

    jo = JObject.Parse(str_responseformjson);

    if (jo["response"].ToString().Equals("ok"))
    {
        return true;
    }
    else
    {
        return false;
    }

}

これは私のクラス JsonWorker のコードです:

    class JsonWorker
    {

    public async Task<HttpWebResponse> sendJSON(string requestUrl, JObject jsonObjesct)
    {
        HttpWebRequest request = (HttpWebRequest) WebRequest.Create(requestUrl);
        request.ContentType = "text/plain; charset=utf-8";
        request.Method = "POST";

        byte[] jsonAsBytes = Encoding.UTF8.GetBytes(jsonObjesct.ToString());

        Stream x = await request.GetRequestStreamAsync();
        await x.WriteAsync(jsonAsBytes, 0, jsonAsBytes.Length);
        x.Close();

        HttpWebResponse response = (HttpWebResponse)(await request.GetResponseAsync());
        return response;
    }

    public async Task<string> getJSON(
        HttpWebResponse response)
    {
        var stream = response.GetResponseStream();
        var sr = new StreamReader(stream);
        string str_responsefromjson = await sr.ReadToEndAsync();
        sr.Close();
        stream.Close();

        return str_responsefromjson;
    }
}

助けてください。

4

1 に答える 1

0

アプリの 1 つにいくつかのワークフローがあります。カスタムUriMapperを使用してこれを解決しました。詳細については、このStackoverflow の回答をお読みください。

これが基本です。UriMapper は、ユーザーが正しいログイン資格情報を既に入力しているかどうかに基づいて、移動するページを処理します。適切な資格情報が以前に与えられていれば、アプリのアクティブ化および起動イベントは常にログインします。

private void Application_Launching(object sender, LaunchingEventArgs e)
{
    RootFrame.UriMapper = new LoginUriMapper();

    if (AppSettings.HasLoginInfo)
    {
        Login();
    }
}
private void Application_Activated(object sender, ActivatedEventArgs e)
{
    if (e.IsApplicationInstancePreserved == false)
    {
        // tombstoned! Need to restore state
        RootFrame.UriMapper = new LoginUriMapper();

        if (AppSettings.NotLoggedIn)
        { 
            Login();
        }
    }
}

MainPage は、ログインが失敗した場合にロジックを処理し、ログイン ページに戻ります。ログイン ページに移動するときは、常にナビゲーション スタックからエントリを削除することを忘れないでください。

protected override void OnNavigatedTo(NavigationEventArgs e)
{
    base.OnNavigatedTo(e);

    while(NavigationService.CanGoBack)
    {
        NavigationService.RemoveBackEntry();
    }
}
于 2013-06-17T14:27:39.963 に答える