Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/260.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Polly使用不同的url重试_C#_Asp.net Core_Polly - Fatal编程技术网

C# Polly使用不同的url重试

C# 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)

我正在尝试与polly一起创建一个解决方案,其中我请求了一个其他api
我有一个指向同一服务的多个实例的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))