[英]C# How to polly the GetStreamAsync api call
我有以下代码调用银行 api,并将响应转换为 object。
public static async Task<ExchangeModel> LoadExchange(string currency, string date)
{
string url = "here is the bank's api url";
var streamTask = await _clientPolicy.LinearHttpRetry.ExecuteAsync(
() => _client.GetStreamAsync(url));
var deserialized = await JsonSerializer.DeserializeAsync<Root>(await streamTask);
var rate = deserialized.ExchangeModel.FirstOrDefault(r => r.Currency == currency);
return rate;
}
我想添加 polly 以便在失败时重试 api 调用。 为此,我创建了一个策略客户端,但我不知道如何检查GetStreamAsync
是否成功,因为它是System.IO.Stream
并且它没有成功状态或其他东西。
public AsyncRetryPolicy<System.IO.Stream> LinearHttpRetry { get; }
public ClientPolicy()
{
LinearHttpRetry = Policy.HandleResult<System.IO.Stream>(
res => !res.IsSuccessStatusCode).
WaitAndRetryAsync(5, retryAttempts => TimeSpan.FromSeconds(3));
}
在这个例子中,我保留了它.res.IsSuccessStatusCode
但在我的例子中没有这样的参数。
您可以执行以下“技巧” ,而不是直接调用GetStreamAsync
:
var response = await _client.GetAsync(url, HttpCompletionOption.ResponseHeadersRead);
//TODO: Check response status code then
using var stream = await response.Content.ReadAsStreamAsync();
首先,您需要像这样更改您的策略定义:
public IAsyncPolicy<HttpResponseMessage> LinearHttpRetry { get; }
public ClientPolicy()
{
LinearHttpRetry = Policy
.HandleResult<HttpResponseMessage>(res => !res.IsSuccessStatusCode)
.WaitAndRetryAsync(5, _ => TimeSpan.FromSeconds(3));
}
然后您还需要调整使用情况
public static async Task<ExchangeModel> LoadExchange(string currency, string date)
{
string url = "here is the bank's api url";
var response = await _clientPolicy.LinearHttpRetry.ExecuteAsync(
async () => await _client.GetAsync(url, HttpCompletionOption.ResponseHeadersRead));
using var stream = await response.Content.ReadAsStreamAsync();
var deserialized = await JsonSerializer.DeserializeAsync<Root>(stream);
var rate = deserialized.ExchangeModel.FirstOrDefault(r => r.Currency == currency);
return rate;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.