延迟建立请求

时间:2018-11-12 03:13:44

标签: c# .net rest architecture

我正在尝试创建一个第三方库来使用API​​。

我创建了一堆可以解决不同api调用的类,例如:

public class AccountsEndpoint: IAccountsEndpoint
{
    public async Task<Account> GetAsync(id)
    {
        return await this.BuildUrl(id).GetJsonAsync();
    }
    //etc...
}

public class NotificationsEndpoint: INotificationsEndpoint
{
    public async Task<Notification> SetPrimary(id)
    {
        return await this.BuildUrl(id).AppendSegment("Primary")
                         .PostJsonAsync(null, cancellationToken)
                         .ReceiveJson<Notification>())();
    }
}

我有很多这样的端点,我想在每个调用之前运行一些其他代码,

例如,如果我的oauth令牌无效,我想获取一个新的访问令牌并自动重试该请求。

我希望必须使用处理程序将所有api调用包装起来:

public async Task<Notification> SetPrimary(id)
{
    return await new CustomErrorHandler(() => 
                     this.BuildUrl(id).AppendSegment("Primary")
                       .PostJsonAsync(null, cancellationToken)
                       .ReceiveJson<Notification>())()).ExecuteAsync();
}

如果我要执行类似的操作,则必须记住在所有端点上都使用错误处理程序,这时我想有一种更好的方法来反转控件。 (或者,我可以生成虚拟接口并在其中包含包装逻辑,但这会产生与手动添加调用相同的问题)。

如何使用错误处理程序逻辑包装所有调用?

1 个答案:

答案 0 :(得分:2)

根据到目前为止的显示,这些端点似乎正在使用Flurl。

在框架使用HttpClient的幕后,框架应该提供可扩展性以利用请求管道。

根据documentation,您应该能够配置全局设置以实现所需的行为。

例如

  

我有很多这些端点,我想在每个调用之前运行一些其他代码

     

例如,如果我的oauth令牌无效,我想获取一个新的访问令牌并自动重试该请求。

private async Task HandleOAuthAsync(HttpCall call) {
    //...check response and if token expired perform some action or trigger some event
}

//...


//register globally
FlurlHttp.Configure(settings => settings.AfterCallAsync = HandleOAuthAsync);

如果需要,甚至可以降级到客户端级别以更直接地访问客户端或消息处理程序。