Пользователь Xamarin выходит из системы при несанкционированном ответе 401 - PullRequest
0 голосов
/ 11 января 2019

У меня есть приложение Xamarin, которое общается с API. Существует определенный сценарий, который происходит при обращении к API, в котором возвращается исключение 401 (неавторизованное). Этот 401 (неавторизованный) возвращается преднамеренно, когда учетная запись пользователя становится неактивной, поэтому, даже если токен пользователя все еще действует в приложении, они не смогут получить какие-либо данные из API.

Я хочу, чтобы пользователь мог выходить из приложения, только когда выдается исключение 401 (неавторизовано).

Мой вызов API выглядит следующим образом:

public async Task<T> GetAsync<T>(string url)
{
    _client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", _authToken?.AccessToken ?? this.GetToken().AccessToken);

    var json = await _client.GetStringAsync(url);

    return json.Deserialize<T>();
}

Когда отладчик достигает строки var json = await _client.GetStringAsync(url);, правильно генерируется исключение 401 (неавторизовано).

Я хочу иметь возможность обработать это исключение 401 (неавторизовано) и выйти из приложения (желательно с предупреждением об этом).

В настоящее время я отлаживаю на устройстве Android, поэтому я попытался добавить следующий код в класс MainActivity.

protected override async void OnCreate(Bundle bundle)
{
    AndroidEnvironment.UnhandledExceptionRaiser += AndroidEnvironmentOnUnhandledException;
}

private void AndroidEnvironmentOnUnhandledException(object sender, RaiseThrowableEventArgs e)
{
    if(e.Exception.InnerException.GetBaseException().Message == "401 (Unauthorized)")
    {

    }
}

Когда выдается ошибка, я проверяю, является ли она 401 (неавторизованной). Именно здесь я думал, что тогда выйду из приложения, но не думаю, что это правильное направление.

Есть ли лучшая практика для передачи сценария такого типа, о которой я еще не знаю?

1 Ответ

0 голосов
/ 14 января 2019

Вы можете попробовать использовать try catch для деформации var json = await _client.GetStringAsync(url), как показано в следующем коде.

 try
        {
            var json = await _client.GetStringAsync(url)
        }
        catch (WebException e)
        {
            using (WebResponse response = e.Response)
            {
                HttpWebResponse httpResponse = (HttpWebResponse)response;
                Console.WriteLine("Error code: {0}", httpResponse.StatusCode);
                using (Stream data = response.GetResponseStream())
                using (var reader = new StreamReader(data))
                {
                    // text is the response body
                    string text = reader.ReadToEnd();

                    if (text == "401 (Unauthorized)")
                    {


                    }
                }
            }
        }
...