Я начинаю с более новой разработки приложений на основе 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
? Что еще можно предложить для этого шаблона?