{"record":{"id":"b052a51010f26f1e","repo":"dotnet/yarp","slug":"missing-required-services-did-you-call-addkuber","errorCode":null,"errorMessage":"Missing required services. Did you call '.AddKubernetesReverseProxy()' when configuring services?","messagePattern":"Missing required services\\. Did you call '\\.AddKubernetesReverseProxy\\(\\)' when configuring services\\?","errorType":"exception","errorClass":"InvalidOperationException","httpStatus":null,"severity":"critical","filePath":"src/Kubernetes.Controller/Management/KubernetesReverseProxyWebHostBuilderExtensions.cs","lineNumber":32,"sourceCode":"public static class KubernetesReverseProxyWebHostBuilderExtensions\n{\n    /// <summary>\n    /// Configures Kestrel for SNI-based certificate selection using Kubernetes Ingress TLS annotations and Kubernetes Secrets.\n    /// </summary>\n    /// <param name=\"builder\">The web host builder.</param>\n    /// <returns>The same <see cref=\"IWebHostBuilder\"/> for chaining.</returns>\n    public static IWebHostBuilder UseKubernetesReverseProxyCertificateSelector(this IWebHostBuilder builder)\n    {\n        ArgumentNullException.ThrowIfNull(builder, nameof(builder));\n\n        builder.ConfigureKestrel(kestrelOptions =>\n        {\n            kestrelOptions.ConfigureHttpsDefaults(httpsOptions =>\n            {\n                var selector = kestrelOptions.ApplicationServices.GetService<IServerCertificateSelector>();\n                if (selector is null)\n                {\n                    throw new InvalidOperationException(\"Missing required services. Did you call '.AddKubernetesReverseProxy()' when configuring services?\");\n                }\n\n                httpsOptions.ServerCertificateSelector = (connectionContext, domainName) =>\n                {\n                    return selector.GetCertificate(connectionContext, domainName);\n                };\n            });\n        });\n\n        return builder;\n    }\n}\n","sourceCodeStart":14,"sourceCodeEnd":45,"githubUrl":"https://github.com/dotnet/yarp/blob/bd11867bee7df522e7fd3effb08a9c85fd616908/src/Kubernetes.Controller/Management/KubernetesReverseProxyWebHostBuilderExtensions.cs#L14-L45","documentation":"Thrown by UseKubernetesReverseProxyCertificateSelector when configuring HTTPS defaults on Kestrel if the IServerCertificateSelector service is not registered in DI. The extension method expects AddKubernetesReverseProxy() to have been called earlier during service configuration to register certificate-management services. This wires up the dynamic TLS certificate selection used by the Kubernetes controller.","triggerScenarios":"Calling UseKubernetesReverseProxyCertificateSelector(builder) on the IWebHostBuilder without first calling AddKubernetesReverseProxy() on the IServiceCollection. The ConfigureHttpsDefaults lambda resolves IServerCertificateSelector from ApplicationServices and finds it null.","commonSituations":"Ordering mistake in Program.cs — calling the IWebHostBuilder extension before the services extension. Copying partial setup code from docs/sample without the AddKubernetesReverseProxy line.","solutions":["Call builder.Services.AddKubernetesReverseProxy() before UseKubernetesReverseProxyCertificateSelector(builder).","Verify the correct namespace/using for the AddKubernetesReverseProxy extension is present so the right overload resolves.","Check that no conditional branch skips the AddKubernetesReverseProxy call in the service configuration path."],"exampleFix":"// before\nbuilder.UseKubernetesReverseProxyCertificateSelector();\n// after\nbuilder.Services.AddKubernetesReverseProxy();\nbuilder.UseKubernetesReverseProxyCertificateSelector();","handlingStrategy":"validation","validationCode":"if (!builder.Services.Any(s => s.ServiceType == typeof(Yarp.ReverseProxy.Model.IServerCertificateSelector) /* or check via AddKubernetesReverseProxy marker */))\n{\n    builder.Services.AddKubernetesReverseProxy();\n}","typeGuard":"// n/a — DI service availability check","tryCatchPattern":"try { builder.UseKubernetesReverseProxyCertificateSelector(); }\ncatch (InvalidOperationException ex) when (ex.Message.Contains(\"AddKubernetesReverseProxy\"))\n{ builder.Services.AddKubernetesReverseProxy(); builder.UseKubernetesReverseProxyCertificateSelector(); }","preventionTips":["Always call AddKubernetesReverseProxy() before any Use... extension in Program.cs.","Centralize service registration in one method to avoid ordering mistakes.","Add an integration test that boots the host to catch missing-service errors."],"tags":["kubernetes","di","service-registration","certificates","startup"],"backgroundTag":null,"analyzedSha":"bd11867bee7df522e7fd3effb08a9c85fd616908","analyzedAt":"2026-08-13T21:29:49.359Z","schemaVersion":2},"datasetVersion":"2026-08-14T00:17:13.853Z"}