方法先决条件

Method Prerequisites

情况

我正在开发 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>();
    }

我构建了一个设置了所有参数的请求,然后执行该请求,然后在出现 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;
    }

ValidAuth 检查 API 是否已登录,如果出现异常,我会尝试刷新令牌。

我想标记需要记录的方法以调用 NeedRelog(),而那些未标记的方法则不调用它。

我可能会在每个方法中都这样做,但它不会干净。

到目前为止我做了什么

我找到了一个很棒的工具:PostSharp,它似乎符合我的需要。

我已经开始像这样检查日志方面了:

[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() 方法。由于这是一个异步方法,我正在努力让我的方面等待它。

我真的很想知道如何将这种 "conditional method call" 与 postsharp 一起使用,它看起来很棒,但事实是在文档中查找了几个小时后,我没有找到一种方法来做我想做的事情。

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

Did you try using a way to make the call synchronous maybe with something like this whosebug.com/a/25097498/3131696 ? – M22an 5 hours ago

由于我无法将评论标记为回答问题,因此我引用了您的评论以使该问题得到解答,如下所示:link

感谢您提供此 M22an。