使用其他代理服务器重试来自.NET的HTTP请求

时间:2018-07-06 01:28:44

标签: .net http proxy polly resiliency

我可以通过.NET应用程序中的代理发出HTTP请求。我可以使用许多代理服务器,有时一个或多个代理服务器会崩溃。如何让我的应用使用其他代理重试HTTP请求?我乐于接受任何建议,并且听说过有关Polly的更多信息,可增加弹性。

3 个答案:

答案 0 :(得分:2)

如果您要使用Polly,也许是这样的:

public void CallGoogle()
{
    var proxyIndex = 0;

    var proxies = new List<IWebProxy>
    {
        new WebProxy("proxy1.test.com"),
        new WebProxy("proxy2.test.com"),
        new WebProxy("proxy3.test.com")
    };

    var policy = Policy
                 .Handle<Exception>()
                 .WaitAndRetry(new[]
                     {
                         TimeSpan.FromSeconds(1),
                         TimeSpan.FromSeconds(2),
                         TimeSpan.FromSeconds(3)
                     }, (exception, timeSpan) => proxyIndex++);

    var client = new WebClient();

    policy.Execute(() =>
    {
        client.Proxy = proxies[proxyIndex];
        client.DownloadData(new Uri("https://www.google.com"));
    });
}

答案 1 :(得分:0)

对于我的用例,事实证明,如果没有Polly,我会更好。

NewKeychainManager

答案 2 :(得分:0)

这是Polly的答案,但我不喜欢没有Polly或没有等待重试的Polly的答案。

public static string RequestWithProxies(string url, string[] proxies)
{
    var client = new WebClient { Credentials = new NetworkCredential(username, password) };
    var result = String.Empty;
    var proxyIndex = 0;

    var policy = Policy.Handle<Exception>()
        .Retry(
            retryCount: proxies.Length,
            onRetry: (exception, _) => proxyIndex++);

    policy.Execute(() =>
    {
        if (proxyIndex >= proxies.Length) throw new Exception($"Exhausted proxies: {String.Join(", ", proxies)}");

        client.Proxy = new WebProxy(proxies[proxyIndex]);
        result = client.DownloadString(new Uri(url));
    });

    return result;
}