2016-07-01 3 views
0

СитуацияМетод Предпосылки

Я работаю на 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, он выглядит потрясающе, но факт заключается в том, что вы искали часы в документации, я не нашел способ делать то, что хочу ,

Я начинаю спрашивать себя, возможно ли достичь того, что я намереваюсь сделать.

+1

Вы пытались использовать способ синхронного вызова, возможно, с чем-то вроде этого http://stackoverflow.com/a/25097498/3131696? – M22an

+0

Он работает как charm ty для этого фрагмента кода, который помог мне понять, как можно синхронизировать async. Ты сэр! –

+0

Рад, что помогло вам @Sebastien – M22an

ответ

1

Вы пытались использовать способ синхронного вызова, возможно, с чем-то вроде этого stackoverflow.com/a/25097498/3131696?- M22an 5 часов назад

Как я не могу отметить комментарий как ответить на вопрос, который я цитирую свой комментарий, чтобы сделать этот вопрос ответил, как здесь сказано: link

Спасибо вам за это M22an.

Смежные вопросы