Error when specifying a HttpMessageHandler - System.InvalidOperationException : No service for type 'RetryDelegatingHandler' has been registered.
I created a custom HttpMessageHandler to handle the retry logic in my HttpClient. (I know that I could have used Polly but what is the fun in that?)
I registered the HttpMessageHandler as part of my typed http client like this:
services.AddHttpClient<IGitHubService, GitHubService>(httpClient => | |
{ | |
httpClient.BaseAddress = new Uri("https://api.github.com/"); | |
httpClient.AddHttpMessageHandler<RetryDelegatingHandler>(); | |
// ... | |
}); |
However when I ran my application it failed with the following error:
System.InvalidOperationException : No service for type ‘Reliability.RetryDelegatingHandler' has been registered.
Stack Trace:
ServiceProviderServiceExtensions.GetRequiredService(IServiceProvider provider, Type serviceType)
ServiceProviderServiceExtensions.GetRequiredService[T](IServiceProvider provider)
<>c__4`1.<AddHttpMessageHandler>b__4_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()
<7 more frames...>
CallSiteRuntimeResolver.VisitDisposeCache(ServiceCallSite transientCallSite, RuntimeResolverContext context)
CallSiteVisitor`2.VisitCallSite(ServiceCallSite callSite, TArgument argument)
CallSiteRuntimeResolver.Resolve(ServiceCallSite callSite, ServiceProviderEngineScope scope)
<>c__DisplayClass2_0.<RealizeService>b__0(ServiceProviderEngineScope scope)
ServiceProvider.GetService(Type serviceType, ServiceProviderEngineScope serviceProviderEngineScope)
ServiceProvider.GetService(Type serviceType)
ServiceProviderServiceExtensions.GetRequiredService(IServiceProvider provider, Type serviceType)
ServiceProviderServiceExtensions.GetRequiredService[T](IServiceProvider provider)
To use the generic AddHttpMessageHandler<T> I need to register the handler through the IoC container:
services.AddTransient<RetryDelegatingHandler>(); |
As an alternative I can use another overload and instantiate the handler myself:
services.AddHttpClient<IGitHubService, GitHubService>(httpClient => | |
{ | |
httpClient.BaseAddress = new Uri("https://api.github.com/"); | |
httpClient.AddHttpMessageHandler(s=> new RetryDelegatingHandler()); | |
// ... | |
}); |