Web Api上的RetryPolicy导致超时

问题描述 投票:0回答:1

我有一个Web Api,它会调用另一个Web api调用以获取一些信息。为了使应用程序更具弹性,我按照以下https://alexandrebrisebois.wordpress.com/2013/02/21/defining-an-http-transient-error-detection-strategy-for-rest-calls/

的步骤实施了HttpTransientErrorDetectionStrategy

之后,我使用下面的代码来调用其他Web应用程序:

RetryPolicy _retryPolicy = new RetryPolicy<HttpTransientErrorDetectionStrategy>(
    new ExponentialBackoff(retryCount: 2, minBackoff: TimeSpan.FromSeconds(0), maxBackoff: TimeSpan.FromSeconds(10), deltaBackoff: TimeSpan.FromSeconds(2)));

var _httpClient = new HttpClient
{
    BaseAddress = new Uri("http://www.microsoft.com")
};

HttpResponseMessage response = _retryPolicy.ExecuteAsync(async () => await _httpClient.GetAsync($"", HttpCompletionOption.ResponseContentRead)).Result;

_httpClient.GetAsync调用被卡住,我不知道为什么。如果我删除_retryPolicy,而直接使用_httpClient.GetAsync,它会在几秒钟内返回。

我在控制台应用程序上具有类似的代码,可以调用同一Web应用程序,并且运行良好,因此这似乎是我在Web API中使用它的方式所特有的。本打算用作Azure上的应用程序,但是当我在本地调试时也会发生。有人知道为什么会卡住吗?我该如何调试?

谢谢!

asp.net-web-api asp.net-web-api2 asp.net-core-webapi webapi retrypolicy
1个回答
0
投票

我在控制台应用程序上具有类似的代码,可以调用同一Web应用程序,并且运行良好,因此这似乎是我在Web API中使用它的方式所特有的。

您发布的代码就在此处被阻止:

HttpResponseMessage response = _retryPolicy.ExecuteAsync(...).Result;

Don't block on async code。而是使用await

HttpResponseMessage response = await _retryPolicy.ExecuteAsync(...);

如果我删除_retryPolicy,而直接使用_httpClient.GetAsync,它会在几秒钟内返回。

如果您的原始代码被阻塞,并且您出于某些原因必须阻塞异步代码,那么您可以使用ConfigureAwait(false) hack

ConfigureAwait(false)

HttpResponseMessage response = _retryPolicy.ExecuteAsync(async () => await _httpClient.GetAsync($"", HttpCompletionOption.ResponseContentRead).ConfigureAwait(false)).Result;

elide async/await

P.S。 async

© www.soinside.com 2019 - 2024. All rights reserved.