Наличие динамического прокси с реализацией HttpClientFactory - PullRequest
3 голосов
/ 08 апреля 2019

у меня Asp.Net Core WebApi. Я делаю Http-запросы в соответствии с HttpClientFactory шаблон . Вот мой пример кода:

public void ConfigureServices(IServiceCollection services)
{
    ...
    services.AddHttpClient<IMyInterface, MyService>();
    ...
}

public class MyService: IMyInterface
{
    private readonly HttpClient _client;

    public MyService(HttpClient client)
    {
        _client = client;
    }

    public async Task CallHttpEndpoint()
    {
        var request = new HttpRequestMessage(HttpMethod.Get, "www.customUrl.com");
        var response = await _client.SendAsync(request);
        ...
    }

}

Я хочу реализовать отправку запросов через динамический прокси. Это в основном означает, что мне может потребоваться изменить прокси-сервер с каждым запросом. На данный момент я нахожу 2 приложения, ни одно из которых не кажется мне хорошим:

1.Имеет статический прокси, как этот:

public void ConfigureServices(IServiceCollection services)
{
    ...
    services.AddHttpClient<IMyInterface, MyService>().ConfigurePrimaryHttpMessageHandler(() =>
        {
            return new HttpClientHandler
            {
                Proxy = new WebProxy("http://127.0.0.1:8888"),
                UseProxy = true
            };
        });
    ...
}

Но в этом подходе я могу использовать только один прокси для каждой службы.

2.Dispose HttpClient с каждым запросом:

    HttpClientHandler handler = new HttpClientHandler()
    {
        Proxy = new WebProxy("http://127.0.0.1:8888"),
        UseProxy = true,
    };

    using(var client = new HttpClient(handler))
    {
        var request = new HttpRequestMessage(HttpMethod.Get, "www.customUrl.com");
        var response = await client.SendAsync(request);
        ...
    }

Но таким образом я нарушаю шаблон HttpClientFactory, и это может вызвать проблемы с производительностью приложения, как указано в следующей статье

Есть ли третий способ, которым я мог бы динамически менять прокси, не создавая заново HttpClient?

1 Ответ

3 голосов
/ 08 апреля 2019

Невозможно изменить любое из свойств HttpClientHandler или назначить новую версию HttpClientHandler существующему HttpClient после его создания. Таким образом, тогда невозможно иметь динамический прокси для определенного HttpClient: вы можете указать только один прокси.

Правильный способ достижения этого - использовать именованные клиенты и определять клиента для каждой конечной точки прокси. Затем вам нужно будет внедрить IHttpClientFactory и выбрать один из прокси для использования, запрашивая именованного клиента, который реализует это.

services.AddHttpClient("MyServiceProxy1").ConfigurePrimaryHttpMessageHandler(() =>
{
    return new HttpClientHandler
    {
        Proxy = new WebProxy("http://127.0.0.1:8888"),
        UseProxy = true
    };
});

services.AddHttpClient("MyServiceProxy2").ConfigurePrimaryHttpMessageHandler(() =>
{
    return new HttpClientHandler
    {
        Proxy = new WebProxy("http://127.0.0.1:8889"),
        UseProxy = true
    };
});

...

Тогда:

public class MyService : IMyInterface
{
    private readonly HttpClient _client;

    public MyService(IHttpClientFactory httpClientFactory)
    {
        _client = httpClientFactory.CreateClient("MyServiceProxy1");
    }

    public async Task CallHttpEndpoint()
    {
        var request = new HttpRequestMessage(HttpMethod.Get, "www.customUrl.com");
        var response = await _client.SendAsync(request);
        ...
    }
}
...