Как использовать HttpClientFactory с клиентом, сгенерированным AutoRest - PullRequest
0 голосов
/ 13 мая 2019

Клиент, сгенерированный AutoRest, не имеет подходящего конструктора для использования его со службами. Метод 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 ]

3 голосов
/ 13 мая 2019

Вам нужно будет использовать именованный клиент, а не типизированный клиент, и затем вам нужно будет зарегистрировать свой клиент 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);
});
0 голосов
/ 13 мая 2019

Я предлагаю более элегантное решение, чем Крис Патт. Мы можем наследовать от сгенерированного класса и определить подходящие для 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);

И определить одноэлементную услугу для использования в контракте на обслуживание.

...