Я работаю с очень нестабильным API. Иногда я получаю 500 Server Error
с Timeout
, в другой раз я также получаю 500 Server Error
, потому что я дал ему ввод, который он не может обработать SqlDateTime overflow. Must be between 1/1/1753 12:00:00 AM and 12/31/9999 11:59:59 PM.
.
Оба этих случая дают мне HttpRequestException
, но я могу посмотреть ответное сообщение с сервера и определить причину исключения. Если это ошибка тайм-аута, я должен попробовать еще раз. Если это неправильный ввод, я должен повторно выбросить исключение, потому что никакие повторные попытки не решат проблему с неверными данными.
Что я хотел бы сделать с Полли, так это проверить ответное сообщение, прежде чем пытаться повторить попытку. Но все образцы, которые я видел до сих пор, включали только тип исключения.
Я до сих пор придумал это:
HttpResponseMessage response = null;
String stringContent = null;
Policy.Handle<FlakyApiException>()
.WaitAndRetry(5, retryAttempt => TimeSpan.FromSeconds(Math.Pow(2, retryAttempt)),
async (exception, timeSpan, context) =>
{
response = await client.PostAsync(requestUri, new StringContent(serialisedParameters, Encoding.UTF8, "application/json"));
stringContent = await response.Content.ReadAsStringAsync();
if (response.StatusCode == HttpStatusCode.InternalServerError && stringContent.Contains("Timeout"))
{
throw new FlakyApiException(stringContent);
}
});
Есть ли лучший способ сделать такую проверку?