我有一个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上的应用程序,但是当我在本地调试时也会发生。有人知道为什么会卡住吗?我该如何调试?
谢谢!
我在控制台应用程序上具有类似的代码,可以调用同一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;
:
elideasync
/await
P.S。 async
。