Как использовать HttpClientFactory с клиентом, сгенерированным AutoRest

Сгенерированный клиентом AutoRest нет подходящего конструктора для использования его с методом services.AddHttpClient (). Итак, как мы можем обойти это?

Теперь у нас есть публичный конструктор с такой подписью.

public Client(ServiceClientCredentials credentials, HttpClient httpClient, bool disposeHttpClient) : this(httpClient, disposeHttpClient)

Но поскольку он имеет аргумент bool disposeHttpClient, мы не можем использовать его напрямую в методе AddHttpClient () для настройки клиентского сервиса в DI. HttpClientFactory, к моему глубокому сожалению, не содержит переопределенную версию метода AddHttpClient с такой сигнатурой:

AddHttpClient<IClient>(Func<IServiceProvider, HttpClietn, IClient> configClient)

Всего 2 ответа


Вам нужно будет использовать именованный клиент, а не типизированный клиент, а затем вам нужно будет зарегистрировать свой клиент AutoRest с использованием заводской перегрузки.

services.AddHttpClient("MyAutoRestClient", c =>
{
    // configure your HttpClient instance
});

services.AddScoped<MyAutoRestClient>(p =>
{
    var httpClient = p.GetRequiredService<IHttpClientFactory>().GetClient("MyAutoRestClient");
    // get or create any other dependencies
    // set disposeHttpClient to false, since it's owned by the service collection
    return new MyAutoRestClient(credentials, httpClient, false);
});

Я предлагаю более элегантное решение, чем Крис Патт. Мы можем наследовать от сгенерированного класса и определить подходящие для DI и AddHttpClient () ctr. Смотрите код ниже.

public partial class MyAutoRestClientExtended: MyAutoRestClient
{
    public MyAutoRestClientExtended(HttpClient httpClient, IOptions<SomeOptions> options)
        : base(new EmptyServiceClientCredentials(), httpClient, false)
    {
        var optionsValue = options.Value ?? throw new ArgumentNullException(nameof(options));
        BaseUri = optionsValue .Url;
    }
}

Теперь мы можем использовать метод AddHttpClient () для настройки типизированного клиента с помощью быстрого конструктора способов со всеми его преимуществами, такими как определение политик Полли и определение HttpHandler.

services.AddHttpClient<MyAutoRestClientExtended>()
                   .ConfigureHttpClient((sp, httpClient) =>
                   {                         
                       httpClient.Timeout = TimeSpan.FromSeconds(30);
                   })
                   .SetHandlerLifetime(TimeSpan.FromMinutes(5))
                   .ConfigurePrimaryHttpMessageHandler(x => new HttpClientHandler() { AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate })
                   .AddHttpMessageHandler(sp => sp.GetService<AuthenticationHandlerFactory>().CreateAuthHandler())
                   .AddPolicyHandlerFromRegistry(PollyPolicyName.HttpRetry)
                   .AddPolicyHandlerFromRegistry(PollyPolicyName.HttpCircuitBreaker);

И определить единый сервис для использования контракта на обслуживание.


Есть идеи?

10000