C# Polly使用不同的url重试
我正在尝试与polly一起创建一个解决方案,其中我请求了一个其他apiC# Polly使用不同的url重试,c#,asp.net-core,polly,C#,Asp.net Core,Polly,我正在尝试与polly一起创建一个解决方案,其中我请求了一个其他api 我有一个指向同一服务的多个实例的URL列表 我希望当第一个请求失败时,另一个请求应该自动从我列表中的下一个url开始 下面是一个示例,我使用两个静态地址尝试这种行为 这个解决方案的问题是,在我启动下一个请求之前,url不会更改。 我希望URL在每次重试时都会更改 public static void ConfigureUserServiceClient(this IServiceCollection services)
我有一个指向同一服务的多个实例的URL列表
我希望当第一个请求失败时,另一个请求应该自动从我列表中的下一个url开始 下面是一个示例,我使用两个静态地址尝试这种行为
这个解决方案的问题是,在我启动下一个请求之前,url不会更改。 我希望URL在每次重试时都会更改
public static void ConfigureUserServiceClient(this IServiceCollection services)
{
_userServiceUri = new Uri("https://localhost:5001");
services.AddHttpClient("someService", client =>
{
client.BaseAddress = _userServiceUri;
client.DefaultRequestHeaders.Add("Accept", "application/json");
}).AddPolicyHandler(retryPolicy());
}
private static IAsyncPolicy<HttpResponseMessage> retryPolicy()
{
return Policy.HandleResult<HttpResponseMessage>(r => r.StatusCode == HttpStatusCode.RequestTimeout)
.WaitAndRetryAsync(3, retryAttempt => TimeSpan.FromSeconds(retryAttempt),
onRetry: (result, span, ctx) =>
{
_userServiceUri = new Uri("https://localhost:5002");
});
}
public static void ConfigureUserServiceClient(此IServiceCollection服务)
{
_userServiceUri=新的Uri(“https://localhost:5001");
services.AddHttpClient(“someService”,client=>
{
client.BaseAddress=\u userServiceUri;
client.DefaultRequestHeaders.Add(“Accept”、“application/json”);
}).AddPolicyHandler(retryPolicy());
}
私有静态IAsyncPolicy retryPolicy()
{
返回策略.HandleResult(r=>r.StatusCode==HttpStatusCode.RequestTimeout)
.WaitAndRetryAsync(3,RetryAttenting=>TimeSpan.FromSeconds(RetryAttenting),
onRetry:(结果、范围、ctx)=>
{
_userServiceUri=新的Uri(“https://localhost:5002");
});
}
> p>您应该考虑使用策略。
像这样:
private static HttpClient client = new HttpClient();
static async Task Main(string[] args)
{
var addressIterator = GetUrls().GetEnumerator();
var retryLikePolicy = Policy<string>
.Handle<HttpRequestException>()
.FallbackAsync(fallbackAction: async (ct) =>
{
if (addressIterator.MoveNext())
return await GetData(addressIterator.Current);
return null;
});
addressIterator.MoveNext();
var data = await retryLikePolicy.ExecuteAsync(
async () => await GetData(addressIterator.Current));
Console.WriteLine("End");
}
static async Task<string> GetData(string uri)
{
Console.WriteLine(uri);
var response = await client.GetAsync(uri);
return await response.Content.ReadAsStringAsync();
}
static IEnumerable<string> GetUrls()
{
yield return "http://localhost:5500/index.html";
yield return "http://localhost:5600/index.html";
yield return "http://localhost:5700/index.html";
}
private static HttpClient=new HttpClient();
静态异步任务主(字符串[]args)
{
var addressIterator=getURL().GetEnumerator();
var retryLikePolicy=策略
.Handle()
.FallbackAsync(fallbackAction:async(ct)=>
{
if(addressIterator.MoveNext())
返回等待获取数据(addressIterator.Current);
返回null;
});
addressIterator.MoveNext();
var data=wait retryLikePolicy.ExecuteAsync(
async()=>await-GetData(addressIterator.Current));
控制台。写入线(“结束”);
}
静态异步任务GetData(字符串uri)
{
Console.WriteLine(uri);
var response=await client.GetAsync(uri);
return wait response.Content.ReadAsStringAsync();
}
静态IEnumerable GetUrls()
{
“收益率”http://localhost:5500/index.html";
“收益率”http://localhost:5600/index.html";
“收益率”http://localhost:5700/index.html";
}
请注意,此代码仅用于演示。是否可以使用IHttpClientFactory使用2个URL而不是许多URL(如主URL和故障切换)来完成此操作?@VergilC。是的,在这种情况下也可以使用完全相同的方法.FallbackAsync(fallbackAction:async(ct)=>wait-GetData(secondaryAddress))
和retryLikePolicy.ExecuteAsync(async()=>wait-GetData(primaryAddress))