Обрабатывать ошибки 4XX в реализации IHttpFilter для более новой версии Windows.Web.Http.HttpClient - PullRequest
0 голосов
/ 10 января 2019

Я начинаю с более новой разработки приложений на основе UWP. При написании клиента http-запроса я заметил, что для большинства моих запросов требовался заголовок Authorization. Поэтому я реализовал / скопировал пример фильтра плагинов, предоставленный в документах MSDN .

Теперь у меня есть 2 метода в моем базовом классе http-клиента, один из которых использует статический / одноэлементный клиент, созданный с указанным выше фильтром, а другой - новый HttpClient при каждом вызове (впервые Логин).

Я планирую использовать метод первого входа, который будет использоваться в случае истечения срока действия токена авторизации в моем фильтре. Чтобы добиться этого, я наивно реализовал цикл do-while:

// The following snippet is from the IHttpFilter implementation
public IAsyncOperationWithProgress<HttpResponseMessage, HttpProgress> SendRequestAsync(HttpRequestMessage request)
{
    return AsyncInfo.Run<HttpResponseMessage, HttpProgress>(async (cancellation, progress) =>
    {
        int retries = 0;
        HttpResponseMessage response;
        do
        {
            string authToken = UserSettings.Instance.AccessToken;
            request.Headers.Authorization = HttpCredentialsHeaderValue.Parse($"Bearer {authToken}");
            response = await baseFilter.SendRequestAsync(request).AsTask(cancellation, progress);
            if (!response.IsSuccessStatusCode && response.StatusCode == HttpStatusCode.Unauthorized)
            {
                new AuthClient().GenerateAccessToken(AuthGrantType.REFRESH);
            }
        } while (response.StatusCode == HttpStatusCode.Unauthorized && ++retries < 3);
        cancellation.ThrowIfCancellationRequested();
        return response;
    });
}

где мой AuthClient.GenerateAccessToken позаботится об обновлении ленивого экземпляра UserSettings.

Этот блок do-while может обновить значение authToken в случае, если истек срок действия старого, но когда он снова возвращается в цикл, возникает следующее исключение:

An exception of type 'System.InvalidOperationException' occurred in System.Private.CoreLib.dll but was not handled in user code
A method was called at an unexpected time. (Exception from HRESULT: 0x8000000E)

Я понимаю, что моя предыдущая задача была кэширована, и, поскольку я await отредактировал ее при первом запуске, задача завершена.

Как мне реализовать логику для relogin в случае просроченного токена? Должен ли быть установлен еще один фильтр, который имеет дело только с делом response.StatusCode == Unauthorized? Что еще можно предложить для этого шаблона?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...