簡體   English   中英

通過 polly 重試模式

[英]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定義了兩個互斥的屬性: ExceptionResult

因此,如果由於拋出HttpRequestException而觸發重試邏輯,則response.Result將為null ,但result.Exception將為HttpRequestException

如果由於HttpResponseMessageStatusCode不同於 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);

請注意HttpRequestExceptionStatusCode返回HttpStatusCode? .

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM