方法先决条件
本文关键字:先决条件 方法 | 更新日期: 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。