Polly 处理响应并检查状态码
Polly handle response and check status code
我创建了一个任务列表并使用 Task.WhenAll() 执行它们。如果 http 请求 returns 错误状态我想重试调用。
我在这一行遇到错误:ExecuteAsync(() => func()));
Cannot implicitly convert type 'System.Threading.Tasks.Task' to'System.Threading.Tasks.Task<System.Net.HttpWebResponse>'
我知道错误的含义,但我需要帮助的部分是使用并行 http 调用和检查响应状态的 Polly 的整体实现。
代码:
var tasks = new List<Task<string>>();
var policy = Policy
.Handle<HttpRequestException>()
.OrResult<HttpWebResponse>(a => a.StatusCode != HttpStatusCode.OK)
.WaitAndRetryForeverAsync(i => pauseBetweenFailures);
var urls = new List<string>();
foreach (var mediaItem in UploadedMediaItems)
{
var mediaRequest = new HttpRequestMessage
{
RequestUri = new Uri("****"),
Method = HttpMethod.Get,
Headers = {
{ "id-token", id_Token },
{ "access-token", access_Token }
}
};
async Task<string> func()
{
var response = await client.SendAsync(mediaRequest);
return await response.Content.ReadAsStringAsync();
}
tasks.Add(policy.ExecuteAsync(() => func()));
}
await Task.WhenAll(tasks);
foreach (var t in tasks)
{
var postResponse = await t;
urls.Add(postResponse);
}
忽略任何其他问题(概念性或其他方面)
您的通用参数 HttpWebResponse
有误,应该是 HttpResponseMessage
因为那是 SendAsync
returns
var policy = Policy
.Handle<HttpRequestException>()
.OrResult<HttpResponseMessage>(a => a.StatusCode != HttpStatusCode.OK)
...
此外,您似乎希望将 策略 应用于 SendAsync
方法,而不是 returns 和 Task<string>
的本地方法
async Task<string> func()
{
var response = await policy.ExecuteAsync(() => client.SendAsync(mediaRequest));
return await response.Content.ReadAsStringAsync();
}
tasks.Add(func());
另请注意,您需要为每次重试重新创建一个新的 HttpRequestMessage
。它们不能重复使用。
可能看起来更像这样
Task<HttpResponseMessage> Send()
{
var mediaRequest = new HttpRequestMessage {... };
return client.SendAsync(mediaRequest);
}
async Task<string> func()
{
var response = await policy.ExecuteAsync(Send);
return await response.Content.ReadAsStringAsync();
}
tasks.Add(func());
然而,说到这一切,您可能希望在通过 AddPolicyHandler
注册服务时使用更现代的方法将 Polly 添加到 IHttpClientFactory
实现中,这又需要处理请求
我创建了一个任务列表并使用 Task.WhenAll() 执行它们。如果 http 请求 returns 错误状态我想重试调用。
我在这一行遇到错误:ExecuteAsync(() => func()));
Cannot implicitly convert type 'System.Threading.Tasks.Task' to'System.Threading.Tasks.Task<System.Net.HttpWebResponse>'
我知道错误的含义,但我需要帮助的部分是使用并行 http 调用和检查响应状态的 Polly 的整体实现。
代码:
var tasks = new List<Task<string>>();
var policy = Policy
.Handle<HttpRequestException>()
.OrResult<HttpWebResponse>(a => a.StatusCode != HttpStatusCode.OK)
.WaitAndRetryForeverAsync(i => pauseBetweenFailures);
var urls = new List<string>();
foreach (var mediaItem in UploadedMediaItems)
{
var mediaRequest = new HttpRequestMessage
{
RequestUri = new Uri("****"),
Method = HttpMethod.Get,
Headers = {
{ "id-token", id_Token },
{ "access-token", access_Token }
}
};
async Task<string> func()
{
var response = await client.SendAsync(mediaRequest);
return await response.Content.ReadAsStringAsync();
}
tasks.Add(policy.ExecuteAsync(() => func()));
}
await Task.WhenAll(tasks);
foreach (var t in tasks)
{
var postResponse = await t;
urls.Add(postResponse);
}
忽略任何其他问题(概念性或其他方面)
您的通用参数 HttpWebResponse
有误,应该是 HttpResponseMessage
因为那是 SendAsync
returns
var policy = Policy
.Handle<HttpRequestException>()
.OrResult<HttpResponseMessage>(a => a.StatusCode != HttpStatusCode.OK)
...
此外,您似乎希望将 策略 应用于 SendAsync
方法,而不是 returns 和 Task<string>
的本地方法
async Task<string> func()
{
var response = await policy.ExecuteAsync(() => client.SendAsync(mediaRequest));
return await response.Content.ReadAsStringAsync();
}
tasks.Add(func());
另请注意,您需要为每次重试重新创建一个新的 HttpRequestMessage
。它们不能重复使用。
可能看起来更像这样
Task<HttpResponseMessage> Send()
{
var mediaRequest = new HttpRequestMessage {... };
return client.SendAsync(mediaRequest);
}
async Task<string> func()
{
var response = await policy.ExecuteAsync(Send);
return await response.Content.ReadAsStringAsync();
}
tasks.Add(func());
然而,说到这一切,您可能希望在通过 AddPolicyHandler
注册服务时使用更现代的方法将 Polly 添加到 IHttpClientFactory
实现中,这又需要处理请求