方法先决条件
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() 方法。由于这是一个异步方法,我正在努力让我的方面等待它。
- 如果我的 OnEntry 方法是异步的,那么如果您未登录,它不会阻止调用。
- 如果我的 OnEntry 方法不是异步的并且我等待 needLog 它冻结并且没有任何反应。
我真的很想知道如何将这种 "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。
情况
我正在开发 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() 方法。由于这是一个异步方法,我正在努力让我的方面等待它。
- 如果我的 OnEntry 方法是异步的,那么如果您未登录,它不会阻止调用。
- 如果我的 OnEntry 方法不是异步的并且我等待 needLog 它冻结并且没有任何反应。
我真的很想知道如何将这种 "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。