这是关于使用Polly库(v7.2.3)和Microsoft.Extensions.Http.Polly(v7.0.5)的策略和上下文.我对HttpRequestMessage
类的SetPolicyExecutionContext
方法感到困惑:我知道当通过HttpClientFactory将策略添加到HttpClient时,它可以工作,但我在HttpClient没有附加任何策略并且它不像我预期的那样工作的情况下使用它.该上下文将在稍后的策略重试委托中使用,如下所示:
OnRetry = (_, _, _, context) => {
var value = context.ContainsKey("X") ? (string)context["X"] : "NOT FOUND";
Debug.WriteLine(value);
},
使用策略的ExecuteAsync方法发送HttpRequest(在设置上下文之后):
//Case 1 (Context in Request)
var context = new Context();
context.Add("X", "ABC");
request.SetPolicyExecutionContext(context);
policy.ExecuteAsync(() => _httpClient.SendAsync(request));
当此代码执行且Web请求失败时,OnReter处理程序始终将"未找到"写入输出.
但是如果上下文直接传递给策略,就像这样:
//Case 2 (Context in Policy)
var context = new Context();
context.Add("myKey", "ABC");
policy.ExecuteAsync((token) => _httpClient.SendAsync(request), context);
然后它就像预期的那样工作:在失败的请求中,输出为"ABC".
为什么会这样呢?我以为在 case 1中,ExecuteAsync方法将从请求中获取上下文并将其传递给执行策略,因此它将等同于 case 2,但这并没有发生,所以看起来我遗漏了一些东西.