Повторите HTTP-запрос от .NET с другим прокси-сервером. - PullRequest
0 голосов
/ 06 июля 2018

Я могу выдавать HTTP-запросы через прокси в приложении .NET. Есть несколько прокси-серверов, которые я могу использовать, и иногда один или несколько отключаются. Как я могу заставить мое приложение повторить HTTP-запрос, используя другой прокси-сервер? Я открыт для любых предложений и слышал хорошие слова о Полли для повышения устойчивости.

Ответы [ 3 ]

0 голосов
/ 11 июля 2018

В моем случае получается, что мне было лучше без Полли.

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

    foreach (var proxy in proxies)
    {
        client.Proxy = new WebProxy(proxy);
        try
        {
            result = client.DownloadString(new Uri(url));
        }
        catch (Exception) { if (!String.IsNullOrEmpty(result)) break; }
    }

    if (String.IsNullOrEmpty(result)) throw new Exception($"Exhausted proxies: {String.Join(", ", proxies)}");
    return result;
}
0 голосов
/ 11 июля 2018

Вот ответ с Полли, но мне он не так нравится, как ответ без Полли или Полли с ожиданием, чтобы повторить попытку.

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;
}
0 голосов
/ 09 июля 2018

Если бы вы использовали Полли, может быть что-то вроде этого:

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"));
    });
}
...