[英]Retry Pattern via polly
請讓我知道下面的代碼中“響應”是否有可能變為 null,如果我嘗試在 onRetry 塊中獲取 response.result 和 response.statuscode 值,則會導致錯誤。
下面的示例代碼
AsyncRetryPolicy<HttpResponseMessage> retryPolicyPost = Policy
.Handle<HttpRequestException>()
.OrResult<HttpResponseMessage>(r => r != null && (!r.IsSuccessStatusCode))
.WaitAndRetryAsync(3, times => TimeSpan.FromMilliseconds(times * 30000),
onRetry: (response, delay, retryCount, context) =>
{
Console.WriteLine(retryCount);
Console.WriteLine(response.Result);
Console.WriteLine(response.Result.StatusCode);
});
感謝您的回復。
在下面的代碼中,“響應”是否有可能變成 null
您的response
參數的類型是DelegateResult<HttpResponseMessage>
,在onRetry
委托中不能是null
。
但是response.Result
可以為空! DelegateResult
定義了兩個互斥的屬性: Exception
和Result
。
因此,如果由於拋出HttpRequestException
而觸發重試邏輯,則response.Result
將為null
,但result.Exception
將為HttpRequestException
。
如果由於HttpResponseMessage
的StatusCode
不同於 200 而觸發重試邏輯,則response.Result
將為HttpResponseMessage
,但result.Exception
將為null
。
這段代碼很容易出錯,它可能會拋出 NRE:
Console.WriteLine(response.Result.StatusCode);
要解決此問題,您可以執行以下操作:
var statusCode = response.Result?.StatusCode ?? ((HttpRequestException)response.Exception).StatusCode;
Console.WriteLine(statusCode);
請注意HttpRequestException
的StatusCode
返回HttpStatusCode?
.
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.