我有一个使用API的Swagger文档生成的API客户端。所有的电话都可以正常工作,除了一个。
不起作用的那个似乎是自动重试,而其他人都没有。它总共发送四个请求。第二个紧接在第一个之后,然后第三个和第四个以十秒为间隔。
以下是客户端生成的一些代码:
...
// Send Request
if (_shouldTrace)
{
ServiceClientTracing.SendRequest(_invocationId, _httpRequest);
}
cancellationToken.ThrowIfCancellationRequested();
* _httpResponse = await this.Client.HttpClient.SendAsync(_httpRequest, cancellationToken).ConfigureAwait(false);
* if (_shouldTrace)
{
ServiceClientTracing.ReceiveResponse(_invocationId, _httpResponse);
}
HttpStatusCode _statusCode = _httpResponse.StatusCode;
cancellationToken.ThrowIfCancellationRequested();
...
我在*
的两行设置了断点。使用Fiddler,我可以看到所有四个调用都在第二个断点被触发之前发生。
我无法在请求中找到任何类型的重试策略。我查看了SendAsync()
source,但它不包含我可以看到的重试逻辑。
我对此感到非常困惑。
每次发送请求时,我都会返回500。但是,由于API不完整,我们现在应该这样做了。
答案 0 :(得分:1)
答案来自一位同事。我需要手动定义重试策略。他提出了这个课程(可能来自谷歌):
public class HttpTransientErrorDetectionStrategy
: ITransientErrorDetectionStrategy
{
private readonly List<HttpStatusCode> _statusCodes =
new List<HttpStatusCode>
{
HttpStatusCode.GatewayTimeout,
HttpStatusCode.RequestTimeout,
HttpStatusCode.ServiceUnavailable,
};
public HttpTransientErrorDetectionStrategy(bool isNotFoundAsTransient = false)
{
if (isNotFoundAsTransient)
_statusCodes.Add(HttpStatusCode.NotFound);
}
public bool IsTransient(Exception ex)
{
var we = ex as WebException;
if (we == null)
return false;
var response = we.Response as HttpWebResponse;
var isTransient = response != null
&& _statusCodes.Contains(response.StatusCode);
return isTransient;
}
并在客户的CustomInitialize()
方法中使用此行:
SetRetryPolicy(new RetryPolicy(new HttpTransientErrorDetectionStrategy(), 0));