gpt4 book ai didi

c# - 如何使用 retry-after header 使用 asp.net http 客户端轮询 API

转载 作者:行者123 更新时间:2023-12-04 15:23:25 25 4
gpt4 key购买 nike

我对在 .net 中使用 http 客户端的 RESTful 消费有点陌生,我在轮询外部 API 时无法理解如何使用 retry-after header 。
这是我目前必须调查的内容:

HttpResponseMessage result = null;
var success = false;
var maxAttempts = 7;
var attempts = 0;

using (var client = new HttpClient())
{
do
{
var url = "https://xxxxxxxxxxxxxxx";
result = await client.GetAsync(url);

attempts++;

if(result.StatusCode == HttpStatusCode.OK || attempts == maxAttempts)
success = true;
}
while (!success);
}

return result;
如您所见,我一直在轮询端点,直到得到 OK 响应或达到最大尝试次数(以停止连续循环)。
我如何使用响应中的 retry-after header 来指示我在循环中的每个调用之间等待的时间?
我只是无法弄清楚如何将其应用于我的情况。
谢谢,

最佳答案

HttpClient 旨在每个应用程序实例化一次,而不是每次使用

private static HttpClient client = new HttpClient();
方法(使用 HTTP Host Header 更新)
private static async Task<string> GetDataWithPollingAsync(string url, int maxAttempts, string host = null)
{
using (HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Get, url))
{
if (host?.Length > 0) request.Headers.Host = host;
for (int attempt = 0; attempt < maxAttempts; attempt++)
{
TimeSpan delay = default;
using (HttpResponseMessage response = await client.SendAsync(request, HttpCompletionOption.ResponseHeadersRead).ConfigureAwait(false))
{
if (response.IsSuccessStatusCode)
return await response.Content.ReadAsStringAsync().ConfigureAwait(false);
delay = response.Headers.RetryAfter.Delta ?? TimeSpan.FromSeconds(1);
}
await Task.Delay(delay);
}
}
throw new Exception("Failed to get data from server");
}
用法
try
{
string result = await GetDataWithPollingAsync("http://some.url", 7, "www.example.com");
// received
}
catch (Exception ex)
{
Debug.WriteLine(ex.Message);
// failed
}

关于c# - 如何使用 retry-after header 使用 asp.net http 客户端轮询 API,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62833209/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com