将DelegatingHandler的sendAsync方法封装在async方法中

本文关键字:方法 async 封装 sendAsync DelegatingHandler | 更新日期: 2023-09-27 18:02:45

我正在研究一个DelegatingHandler来拦截从一个服务到另一个服务的所有呼叫。我对DelegatingHandlers是完全陌生的。

这就是问题所在。我们目前有一个API,可以接受调用并测量并发调用,如果需要的话,它有一些机制来限制它。它是这种形式。(由于实际的API对于调试来说很重,我实际上使用以下存根方法来测试这个)

private  Task<HttpResponseMessage> ExecuteAsync1(Func<Task<HttpResponseMessage>> action)
{
    return ExecuteAsync2(action);
}
private async Task<HttpResponseMessage> ExecuteAsync2(Func<Task<HttpResponseMessage>> action)
{
    return await action().ConfigureAwait(false);
}

现在,在这个委托处理程序中,我必须像这样使用这个API。

protected async override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
{
    if (this.ThrottlingFactory == null || !this.ThrottlingEnabled)
    {
        return await base.SendAsync(request, cancellationToken);
    }
    else
    {
        var response = await this.ExecuteAsync1(() =>
        {
            return base.SendAsync(request, cancellationToken);
        });
        // Analyse response for certain thing here.
        return response;
    }
}

我的问题是,在执行ExecuteAsync1(它实际上完成了ExecuteAsync2)之后,代码永远不会返回。我尝试了许多变体,比如将async/await添加到链中的所有方法中,包括anon方法等。有人能指出我做错了什么吗?

将DelegatingHandler的sendAsync方法封装在async方法中

这是我必须做的。我不得不用ConfigureAwait(false)来接电话。

 var response = await this.ExecuteAsync1(() =>
            {
                return base.SendAsync(request, cancellationToken);
            }).ConfigureAwait(false);