方法先决条件

本文关键字:先决条件 方法 | 更新日期: 2023-09-27 17:53:33

形势

我正在开发OAuth2 Api Wrapper。有些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>();
    }

我构建了一个设置了所有参数的请求,然后执行请求,然后在出现api错误的情况下处理答案,然后输出一个包含请求给我的所有数据的对象。

问题

使用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;
    }

使用API检查ValidAuth,如果您已登录,并且如果我有异常,则我将尝试刷新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方法不是异步的,并且我等待needLog,它就会冻结,什么也不会发生

我真的很想知道在postsharp中使用这种"条件方法调用",它看起来很棒,但事实是,在文档中找了几个小时后,我没有找到一种方法来做我想做的事情。

我开始问自己是否有可能实现我的目标

你有没有尝试过使用类似stackoverflow.com/a/25097498/3131696这样的方法使调用同步M22和5小时前

由于我不能将评论标记为回答问题,我引用你的评论来回答这个问题,正如这里所说:链接

感谢您的M22。

方法先决条件