Я реализую функцию в своем приложении UWP (LogoutUser), которая выходит из системы пользователя и перенаправляет его на страницу входа в систему.LogoutUser имеет параметр типа Page, который определяет страницу, с которой была вызвана функция.
Мне нужен этот параметр для вызова метода «параметр» .Frame.Navigate (typeof (LoginPage)), поэтому он перенаправляетпользователя для входа в систему.
Я вызываю этот метод при нажатии кнопки «Выход» и автоматически по таймеру, если срок действия токена, который использует пользователь, истек.
Мое приложение можетначать на двух разных страницах:
- LoginPage, если токен не сохранен в файле json локально;
- HomePage, если токен присутствует.
Моя проблема в том, что когда приложение запускается на HomePage и токен истекает, функция вызывается так, что страница является LoginPage, а Frame - нулевым.
Я попытался исправить это, перезапустив приложение,если фрейм имеет значение null, с методом CoreApplication.RequestRestartAsync, но мне не очень нравится этот обходной путь, и когда приложение перезапускается, оно не «открывает» автоматlly (он находится на панели задач, но пользователь должен дважды щелкнуть по нему, чтобы открыть его).
Функция, которая вызывается таймером на тике.Функция находится внутри LoginPage, и я передаю «this» функции LogoutUser.
private async void TimerScadenzaToken(object sender, object e)
{
await LoadGlobals();
_clientAuth.DefaultRequestHeaders.Authorization = new HttpCredentialsHeaderValue("Bearer", _globals.Token.ToString());
string checkToken = _globals.UriAuth.ToString() + "authentication";
Uri uriAuthCheckToken = new Uri(checkToken);
HttpResponseMessage risposta = await _clientAuth.GetAsync(uriAuthCheckToken);
if (risposta.IsSuccessStatusCode)
{
return;
}
else
{
LogoutUser(this);
timer.Stop();
return;
}
}
Функция LogoutUser, которая также удаляет токен из файла json и вызывает API для удаления его из базы данных.Мой обходной путь можно увидеть в конце функции, если фрейм равен нулю.
public void LogoutUser(Page pageProvenienzaRichiesta)
{
Task asyncLoadGlobals = Task.Run(async () => await LoadGlobals());
asyncLoadGlobals.Wait();
string token = _globals.Token.ToString();
dynamic tokenDinamico = new
{
token
};
string tokenDaInviare = JsonConvert.SerializeObject(tokenDinamico);
HttpStringContent httpStringContent = new HttpStringContent(tokenDaInviare, Windows.Storage.Streams.UnicodeEncoding.Utf8, "application/json");
string deleteToken = _globals.UriAuth.ToString() + "authentication/deleteToken";
Uri uriAuthDeleteToken = new Uri(deleteToken);
var eliminaToken = _clientAuth.PostAsync(uriAuthDeleteToken, httpStringContent);
eliminaToken.AsTask().Wait();
Task asyncDeleteJsonLocal = Task.Run(async () => await new Globals().DeleteJsonToken());
asyncDeleteJsonLocal.Wait();
if (pageProvenienzaRichiesta.Frame != null)
{
pageProvenienzaRichiesta.Frame.Navigate(typeof(LoginPage));
}
else
{
Task asyncRestart = Task.Run(async () => await Reboot());
asyncRestart.Wait();
}
}
Я вызываю асинхронные методы таким образом, потому что я вызываю, извините за повторение, метод LogoutUser внутриконструктор и UWP зависают, если я использую .Wait ().
Я надеюсь, что вы можете помочь мне исправить это, либо показав мне, что я сделал что-то не так, либо сообщив мне другой способ сделать это.
Если вам нужны другие сведения, спросите меня о чем-либо.
Спасибо всем, кто готов мне помочь.