Skip to content

Keyed services aren't working with HttpClientBuilder #89446

Closed as not planned
Closed as not planned
@xakep139

Description

@xakep139

Description

It seems that IHttpClientFactory doesn't support newly added #64427.

Reproduction Steps

var services = new ServiceCollection();
var httpClientBuilder = services
    .AddHttpClient("named");

httpClientBuilder.Services.TryAddKeyedSingleton<MyClientLogger>(httpClientBuilder.Name);
httpClientBuilder.AddLogger(sp => sp.GetRequiredKeyedService<HttpClientLogger>(httpClientBuilder.Name));

using var provider = services.BuildServiceProvider();

var httpClientFactory = provider.GetRequiredService<IHttpClientFactory>();
using var httpClient = httpClientFactory.CreateClient("named");

And MyLogger simply implements IHttpClientLogger.

Expected behavior

No exception is thrown.

Actual behavior

System.InvalidOperationException is thrown with the next message: This service provider doesn't support keyed services.

Stack Trace:

    ServiceProviderKeyedServiceExtensions.GetRequiredKeyedService(IServiceProvider provider, Type serviceType, Object serviceKey)
    ServiceProviderKeyedServiceExtensions.GetRequiredKeyedService[T](IServiceProvider provider, Object serviceKey)
    <>c__DisplayClass25_0.<Test_test>b__0(IServiceProvider sp) line 773
    <>c__DisplayClass27_0.<AddLogger>b__1(HttpMessageHandlerBuilder b)
    <>c__DisplayClass17_0.<CreateHandlerEntry>g__Configure|0(HttpMessageHandlerBuilder b)
    <>c__DisplayClass3_0.<Configure>b__0(HttpMessageHandlerBuilder builder)
    DefaultHttpClientFactory.CreateHandlerEntry(String name)
    <.ctor>b__1()
    Lazy`1.ViaFactory(LazyThreadSafetyMode mode)
    Lazy`1.ExecutionAndPublication(LazyHelper executionAndPublication, Boolean useDefaultConstructor)
    Lazy`1.CreateValue()
    DefaultHttpClientFactory.CreateHandler(String name)
    DefaultHttpClientFactory.CreateClient(String name)
    MyTests.Test() line 778
    RuntimeMethodHandle.InvokeMethod(Object target, Void** arguments, Signature sig, Boolean isConstructor)
    MethodInvoker.Invoke(Object obj, IntPtr* args, BindingFlags invokeAttr)

Regression?

No response

Known Workarounds

No response

Configuration

.NET SDK 8.0.100-preview.7.23360.1
I was referencing runtime packages with version 8.0.0-rc.1.23373.2.

Other information

I haven't tried, but the same issue could probably be the case when ConfigureHttpClientDefaults() is used and in its configure action a keyed service is registered/resolved.

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions