Проблема расширения RegisterServices с ConfigurePrimaryHttpMessageHandler и ConfigureHttpClient - PullRequest
0 голосов
/ 20 марта 2020

Я использую Prism.DryIoc, Prism.DryIoc.Extensions и Microsoft.Extensions.Http.

Мне нужно зарегистрировать несколько сервисов, работающих с разными API.

  1. Сервис, работающий с BaseAddress1 и используя обработчик GZip
  2. Служба, работающая с BaseAddress2

Я добавил это переопределение, чтобы избежать NotImplementedException:
protected override IContainerExtension CreateContainerExtension() => PrismContainerExtension.Current;

protected override void RegisterTypes(IContainerRegistry containerRegistry)
{
    containerRegistry.RegisterServices(s =>
    {
        s.AddHttpClient<ICenterService, CenterService>(c =>
         {
             c.BaseAddress = new Uri(BaseAddresses.Api1);
         })
         .ConfigurePrimaryHttpMessageHandler(sp => new HttpClientHandler
         {
             AllowAutoRedirect = false,
             AutomaticDecompression = DecompressionMethods.Deflate | DecompressionMethods.GZip
         });

        s.AddHttpClient<IS3MediaService, S3MediaService>(c =>
        {
            c.BaseAddress = new Uri(BaseAddresses.Api2);
        });
    });

    containerRegistry.Register<ICountryService, CountryService>();
}

У меня есть проблемы даже с первой инъекцией, потому что HttpClient имеет нулевое значение BaseAddress. Он будет иметь значение BaseAddress, если я уберу вызов ConfigurePrimaryHttpMessageHandler.

Если я добавлю второй в другое представление, я получу следующее исключение в представлении, которому я его вставил.

DryIoc.ContainerException: Container is disposed and should not be used: "Container with Scope disposed{no name}
 with Rules with {FuncAndLazyWithoutRegistration, AutoConcreteTypeResolution} and without {ThrowOnRegisteringDisposableTransient}
 with Made={FactoryMethod=ConstructorWithResolvableArguments} has been DISPOSED!
 You may include Dispose stack-trace into the message via:
container.With(rules => rules.WithCaptureContainerDisposeStackTrace())"

Я создал ConsoleApp с помощью одного AddHttpClient вызова, и конфигурации как обработчика, так и клиента, и он там работает (введенный httpClient имел BaseAddress и может работать с GZip)

Что я делаю не так?

...