繁体   English   中英

C# 如何轮询 GetStreamAsync api 调用

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM