СитуацияМетод Предпосылки
Я работаю на oauth2 Api обертке. Некоторые маршруты api предназначены для зарегистрированных пользователей, а некоторые для анонимности и регистрации.
Вот пример одного метода в моей обертке:
public async Task<UploadListResponse> List(bool pagination = false, int page = 1, int limit = 10)
{
var request = UploadRequests.List(pagination, page, limit);
var cancellationTokenSource = new CancellationTokenSource();
var restResponse = await Context.Client.ExecuteTaskAsync(request, cancellationTokenSource.Token);
return restResponse.Handle<UploadListResponse>();
}
я построить запрос со всеми настройке параметров затем выполнить запрос, а затем обработать ответ в случае, если у меня есть ошибки апи, а затем выходной объект, содержащий все данные, которые запрос дал мне.
Проблема
С OAuth2, при входе в API вы получите доступ токена и токен обновления. Если ваш токен доступа истек, вам необходимо обратиться к api с токеном обновления, чтобы получить новый токен доступа.
Как я уже говорил ранее, некоторые из моего метода необходимо, чтобы вы авторизовались, но если ваш маркер доступа истек, я хочу, чтобы попытаться обновить маркер, прежде чем выбросить исключение, как с помощью этого метода:
public async Task<bool> NeedRelog()
{
try
{
var validAuth = await ValidAuth();
}
catch
{
try
{
var refresh = await Refresh(Context.Client.Config.RefreshToken);
}
catch
{
return true;
}
}
return false;
}
ValidAuth проверить с API, если вы вошли в систему, и если у меня есть исключение, я попробую обновитьToken.
Я хочу пометить метод, который необходимо выполнить для вызова NeedRelog(), и тех, кто не тег, чтобы не называть его.
Я могу просто сделать это в каждом методе, но это не будет чистым.
Что я сделал до сих пор
Я нашел отличный инструмент: PostSharp который, кажется, соответствует моим потребностям.
Я начал делать аспект checkLog как это:
[Serializable]
public class CheckLog : OnMethodBoundaryAspect, IOnStateMachineBoundaryAspect
{
public CheckLog()
{
ApplyToStateMachine = false;
}
public override void OnEntry(MethodExecutionArgs args)
{
var instance = (ApiService)args.Instance;
var res = instance.Parent.OAuth.NeedRelog().Result;
if (!res)
{
args.Exception = new Exception("Need to relog");
args.FlowBehavior = FlowBehavior.Return;
}
}
}
Где я застрял
Главная проблема с вызовом моей NeedRelog() метод. В связи с тем, что это асинхронный метод, я изо всех сил стараюсь, чтобы мой аспект ожидал его.
- Если мой метод OnEntry является асинхронным, то он не будет блокировать вызов, если вы не зарегистрированы.
- Если мой метод OnEntry не является асинхронным, и я жду необходимости, он замораживается, и ничего не происходит.
Я действительно хочу знать, как использовать этот «условный вызов метода» с помощью postsharp, он выглядит потрясающе, но факт заключается в том, что вы искали часы в документации, я не нашел способ делать то, что хочу ,
Я начинаю спрашивать себя, возможно ли достичь того, что я намереваюсь сделать.
Вы пытались использовать способ синхронного вызова, возможно, с чем-то вроде этого http://stackoverflow.com/a/25097498/3131696? – M22an
Он работает как charm ty для этого фрагмента кода, который помог мне понять, как можно синхронизировать async. Ты сэр! –
Рад, что помогло вам @Sebastien – M22an