方法先决条件

时间:2016-07-01 03:20:19

标签: c# asynchronous aop restsharp postsharp

情况

我正在研究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,如果我有异常,那么我将尝试使用refreshToken。

我想标记需要记录的方法来调用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它冻结,没有任何反应。

我真的想知道在postharp中使用这种“条件方法调用”,它看起来很棒,但事实是在文档中查找了几个小时后我找不到按照我想要的方式行事。

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

1 个答案:

答案 0 :(得分:1)

  

您是否尝试使用某种方式使同步调用同步stackoverflow.com/a/25097498/3131696? - M22an 5小时前

由于我无法将评论标记为回答问题,因此我引用您的评论以回答此问题,如下所述:link

谢谢你的M22an。