定期重新加载 SearchServiceClient 和子 ISearchIndexClient 单例上的凭据

Periodically reload credentials on SearchServiceClient and child ISearchIndexClient singletons

在我们的 Web 应用程序依赖项注入中,我们将 .NET Azure 搜索 SDK 的 SearchServiceClient.Indexes.GetClient(...) 返回的 ISearchIndexClient 个实例配置为单例。

我们这样做是因为答案 提到这些 类 共享一个 HTTP 客户端。为了避免端口耗尽,我们需要一个共享的 HttpClient.

但是,问题在于这意味着我们需要重新启动 Web 应用程序才能从 KeyVault 重新加载新的查询密钥(秘密)。考虑一个秘密轮换流程:在将新秘密放入 KeyVault 之后但在使旧秘密无效之前,我们需要 restart/redeploy 我们的 Web 应用程序。

Azure 搜索 .NET SDK 是否推荐工厂或其他模式来定期获取新的 SearchServiceClientISearchIndexClient?出于性能原因,我大部分时间都想要一个单例,但每隔几个小时就想要一个新实例(例如)。

我们的代码现在看起来像这样。它使用 Autofac,但我认为它明白了要点:

containerBuilder
    .Register(c =>
    {
        var options = c.Resolve<IOptionsSnapshot<AzureSearchConfiguration>>();
        return new SearchServiceClient(
            options.Value.SearchServiceName,
            new SearchCredentials(options.Value.SearchServiceApiKey));
    });

containerBuilder
    .Register(c =>
    {
        var serviceClient = c.Resolve<SearchServiceClient>();
        var options = c.Resolve<IOptionsSnapshot<AzureSearchConfiguration>>();
        return serviceClient.Indexes.GetClient(options.Value.SearchIndexName);
    })
    .SingleInstance();

我可以建立一个基于时间的工厂,不时吐出一个新的 SearchServiceClientISearchIndexClient,但我希望有些东西已经存在。

SearchIndexClient 个实例实施您自己的 factory/pool 是可行的方法。遗憾的是,此类功能未包含在 SDK 中,因此您必须自己动手。