{"record":{"id":"5d559044d2f1b257","repo":"microsoft/aspire","slug":"a-searchindexclient-could-not-be-configured-ensure-valid","errorCode":null,"errorMessage":"A SearchIndexClient could not be configured. Ensure valid connection information was provided in 'ConnectionStrings:{connectionName}' or specify an '{nameof(AzureSearchSettings.Endpoint)}' in the '{configurationSectionName}' configuration section.","messagePattern":"A SearchIndexClient could not be configured\\. Ensure valid connection information was provided in 'ConnectionStrings:(.+?)' or specify an '(.+?)' in the '(.+?)' configuration section\\.","errorType":"exception","errorClass":"InvalidOperationException","httpStatus":null,"severity":"error","filePath":"src/Components/Aspire.Azure.Search.Documents/AspireAzureSearchExtensions.cs","lineNumber":81,"sourceCode":"        new AzureSearchComponent().AddClient(builder, DefaultConfigSectionName, configureSettings, configureClientBuilder, connectionName: name, serviceKey: name);\n    }\n\n    private sealed class AzureSearchComponent : AzureComponent<AzureSearchSettings, SearchIndexClient, SearchClientOptions>\n    {\n        // `SearchIndexClient` is in the Azure.Search.Documents.Indexes namespace\n        // but uses `SearchClientOptions` which is in the Azure.Search.Documents namespace\n        // https://github.com/Azure/azure-sdk-for-net/blob/bed506dee05319ff2de27ca98500daa10573fe7d/sdk/search/Azure.Search.Documents/src/Indexes/SearchIndexClient.cs#L92\n        protected override string[] ActivitySourceNames => [\"Azure.Search.Documents.*\"];\n\n        protected override IAzureClientBuilder<SearchIndexClient, SearchClientOptions> AddClient(\n            AzureClientFactoryBuilder azureFactoryBuilder, AzureSearchSettings settings, string connectionName,\n            string configurationSectionName)\n        {\n            return azureFactoryBuilder.AddClient<SearchIndexClient, SearchClientOptions>((options, _, _) =>\n            {\n                if (settings.Endpoint is null)\n                {\n                    throw new InvalidOperationException($\"A SearchIndexClient could not be configured. Ensure valid connection information was provided in 'ConnectionStrings:{connectionName}' or specify an '{nameof(AzureSearchSettings.Endpoint)}' in the '{configurationSectionName}' configuration section.\");\n                }\n\n                if (!string.IsNullOrWhiteSpace(settings.Key))\n                {\n                    return new SearchIndexClient(settings.Endpoint, new AzureKeyCredential(settings.Key), options);\n                }\n                else\n                {\n                    return new SearchIndexClient(settings.Endpoint, settings.Credential ?? AzureCredentialHelper.CreateDefaultAzureCredential(), options);\n                }\n            });\n        }\n\n        protected override void BindClientOptionsToConfiguration(IAzureClientBuilder<SearchIndexClient, SearchClientOptions> clientBuilder, IConfiguration configuration)\n        {\n#pragma warning disable IDE0200 // Remove unnecessary lambda expression - needed so the ConfigBinder Source Generator works\n            clientBuilder.ConfigureOptions(options => configuration.Bind(options));\n#pragma warning restore IDE0200","sourceCodeStart":63,"sourceCodeEnd":99,"githubUrl":"https://github.com/microsoft/aspire/blob/25830f84bd145686607ad00c057b3f84e2e51d43/src/Components/Aspire.Azure.Search.Documents/AspireAzureSearchExtensions.cs#L63-L99","documentation":"Aspire's Azure AI Search integration throws this when AzureSearchSettings.Endpoint is null and no connection string provided one. A SearchIndexClient needs either an endpoint (with a credential) or a connection string; without either the client cannot be constructed. The library fails fast at client-creation time instead of letting the Azure SDK throw a less clear error.","triggerScenarios":"Calling builder.AddAzureSearchClient(...) with no 'ConnectionStrings:<connectionName>' entry and no 'Aspire:Azure:Search:Documents:Endpoint' (or Endpoint set via configureSettings).","commonSituations":"Connection string not added to appsettings.json or user secrets; resource named differently in the connection string dictionary than the connectionName passed to AddAzureSearchClient; using endpoint-only auth but forgetting the Endpoint key when switching from key-based auth.","solutions":["Add a connection string entry: \"ConnectionStrings\": { \"search\": \"Endpoint=https://<account>.search.windows.net/\" }","Set the Endpoint in the config section: \"Aspire:Azure:Search:Documents\": { \"Endpoint\": \"https://<account>.search.windows.net/\" }","Set it in code via configureSettings: settings.Endpoint = new Uri(\"https://<account>.search.windows.net\")","Confirm the connectionName argument matches the key in ConnectionStrings"],"exampleFix":"// before\n\"ConnectionStrings\": {}\n// after\n\"ConnectionStrings\": {\n  \"search\": \"Endpoint=https://mysearch.search.windows.net/\"\n}\n// and register with builder.AddAzureSearchClient(\"search\");","handlingStrategy":"validation","validationCode":"if (builder.Configuration.GetConnectionString(\"search\") is null &&\n    builder.Configuration[\"Aspire:Azure:Search:Documents:Endpoint\"] is null)\n    throw new InvalidOperationException(\"Provide ConnectionStrings:search or Aspire:Azure:Search:Documents:Endpoint.\");","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Register the connection string via WithReference in the AppHost rather than hand-editing config","Keep connectionName arguments identical to resource names","Validate required config at startup with a fail-fast check"],"tags":["azure","search","configuration","endpoint"],"backgroundTag":"missing-required-config-field","analyzedSha":"25830f84bd145686607ad00c057b3f84e2e51d43","analyzedAt":"2026-09-16T11:10:06.193Z","contentChangedAt":"2026-09-16T11:10:06.193Z","schemaVersion":2},"datasetVersion":"2026-09-21T04:17:39.646Z"}