簡體   English   中英

Polly Timeout 樂觀使用 HttpClientFactory。 如何使用取消令牌?

[英]Polly Timeout optimistic using HttpClientFactory. How can I use cancellation token?

我想了解如何使用HttpClientFactory與 Polly 實現樂觀超時策略。

在網上的示例中,在調用異步方法時使用了超時策略,以便能夠傳遞取消令牌。 但是,如果我從配置服務中設置超時策略,如指南中所示),我該如何管理取消令牌?

在示例代碼中,來自鏈接的指南,我看到了:

var timeoutPolicy = Policy.TimeoutAsync<HttpResponseMessage>(10); // Timeout for an individual try

serviceCollection.AddHttpClient("GitHub", client =>
{
    client.BaseAddress = new Uri("https://api.github.com/");
    client.DefaultRequestHeaders.Add("Accept", "application/vnd.github.v3+json");
    client.Timeout = TimeSpan.FromSeconds(60); // Overall timeout across all tries
})
.AddPolicyHandler(retryPolicy)
.AddPolicyHandler(timeoutPolicy);

您應該將重試和超時策略鏈接到一個組合策略中。

你有兩個選擇:

Wrap方法

.AddPolicyHandler(retryPolicy.Wrap(timeoutPolicy))
  • timeoutPolicy是內部策略,因此它分別應用於每次嘗試
  • retryPolicy是外部策略,因此它覆蓋了超時策略
  • 注意訂購事項(我將在后面的部分詳細說明)

PolicyWrap class

.AddPolicyHandler(Policy.Wrap(retryPolicy,timeoutPolicy))
  • 第一個參數是最外層策略
  • 最后一個參數是最內在的策略

訂購很重要

您應該知道,以下兩種組合策略非常不同:

Policy.Wrap(retryPolicy,timeoutPolicy)
Policy.Wrap(timeoutPolicy, retryPolicy)
  • 在第一種情況下,您有一個本地超時,它適用於每次重試嘗試
  • 在第二種情況下,您有一個全局超時,它適用於整體重試活動

推進這個想法,您可以通過定義全局超時來避免設置 HttpClient 的Timeout屬性:

var localTimeoutPolicy = Policy.TimeoutAsync<HttpResponseMessage>(10);
var globalTimeoutPolicy = Policy.TimeoutAsync<HttpResponseMessage>(60);
var resilientStrategy = Policy.Wrap(globalTimeoutPolicy, retryPolicy, localTimeoutPolicy);

serviceCollection.AddHttpClient("GitHub", client =>
{
    client.BaseAddress = new Uri("https://api.github.com/");
    client.DefaultRequestHeaders.Add("Accept", "application/vnd.github.v3+json");
})
.AddPolicyHandler(resilientStrategy);

暫無
暫無

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

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