将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方法等。有人能指出我做错了什么吗?
这是我必须做的。我不得不用ConfigureAwait(false)
来接电话。
var response = await this.ExecuteAsync1(() =>
{
return base.SendAsync(request, cancellationToken);
}).ConfigureAwait(false);