Это действительно зависит от того, какие библиотеки вы используете в своем проекте. Но предположим, что вы используете обычный c# для обработки ваших HTTP-вызовов.
[ВАРИАНТ 1] Polly
Я могу порекомендовать вас глядя на Полли
Это отличная библиотека с множеством функций. Вы можете использовать политику Retry
для обработки маркеров с истекшим сроком действия:
var _unauthorizedPolicy = Policy
.Handle<Exception>(ex => ex.StatusCode == HttpStatusCode.Unauthorized) // check here for your exception to be the right one
.RetryAsync(3, async (exception, retryCount, context) =>
{
try
{
var token = await _authService.RefreshToken();
// save the new token or whatever you need to store it
}
catch (Exception ex)
{
// RefreshToken failed, you should probably sign out the user
SignOut();
}
});
Это означает, что Полли попытается выполнить ваш обычный HTTP-вызов, и в случае сбоя, а причина указана в Handle
затем запускается механизм повторных попыток, который попытается обновить sh токен и затем повторить ваш запрос. В конце концов, если токен не может быть обновлен, вы выходите из системы. Конечно, все это можно настроить, проверьте документацию Полли.
Обратите внимание, что внутри Handle<T>
вы должны поместить правильное исключение. Я просто использовал Exception
в качестве заполнителя, так как я не уверен, какое исключение выдается в вашем случае.
Тогда вы бы назвали свой метод с этой политикой:
var result = await _unauthorizedPolicy.ExecuteAsync(() => GetProfileSetup())
И вы может повторно использовать эту политику для любого вызова, не нужно создавать ее каждый раз.
[ВАРИАНТ 2] DelegatingHandler
Мне здесь будет нужен другой ответ StackOverflow: Как обновить sh токен с помощью IHttpClientFactory
По сути, вы можете перехватывать каждый HTTP-вызов, сделанный через HttpClient, и обновлять / добавлять токен к вашим запросам.
Обратите внимание, что этот ответ не обязывает вас использовать IHttpClientFactory
, это также работает для простого HttpClient
.
Также немного вне топи c. Возможно, вы захотите найти библиотеки для обработки вызовов htt, например, Retrofit. Это действительно уменьшит количество шаблонного кода.