外部Webサービスでユーザーを認証するこのアプリがあり、認証されると別のビューに移動する必要があります。
認証はHttpWebRequestで行われます。
private void btnLogin_Click(object sender, RoutedEventArgs e)
{
HttpWebRequest request = (HttpWebRequest)System.Net.WebRequest.Create("http://webservice");
request.Method = "GET";
request.BeginGetResponse(new AsyncCallback(CheckLogin), request);
}
次に、コールバックがあります。
private void CheckLogin(IAsyncResult asynchronousResult)
{
HttpWebRequest request = (HttpWebRequest)asynchronousResult.AsyncState;
bool success = false;
try
{
// End the operation
HttpWebResponse response = (HttpWebResponse)request.EndGetResponse(asynchronousResult);
Stream streamResponse = response.GetResponseStream();
StreamReader streamRead = new StreamReader(streamResponse);
string responseString = streamRead.ReadToEnd();
if (responseString.Contains("ok"))
{
success = true;
}
streamResponse.Dispose();
streamRead.Dispose();
response.Dispose();
}
catch (Exception e)
{
}
request.Abort();
request = null;
if (success)
{
this.Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>
{
Frame.Navigate(typeof(Main2));
}).AsTask().Wait();
}
}
これは、Visual Studioでデバッグする場合は完全に機能しますが、アプリケーションを公開してパッケージをインストールすると、Frame.Navigateでハングします。これは、CheckLoginメソッドがUIスレッドで実行されていないためだと思います。
バックグラウンドスレッドでFrame.Navigate(..)を実行する方法に関するアイデアはありますか?