【问题标题】:RetryPolicy on Web Api causes timeoutWeb Api 上的 RetryPolicy 导致超时
【发布时间】:2020-05-21 01:31:43
【问题描述】:

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

之后,我使用如下代码调用另一个网络应用:

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】:

我在控制台应用程序上有类似的代码,用于调用相同的 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

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

elide async/await:

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

附: Check out DecorrelatedJitterBackoffV2.

【讨论】:

  • 完美,这些建议中的任何一个都可以解决我的问题!谢谢!
猜你喜欢
  • 2018-05-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-16
  • 2016-09-24
相关资源
最近更新 更多