C# 定期在SearchServiceClient和子ISearchIndexClient单例上重新加载凭据

C# 定期在SearchServiceClient和子ISearchIndexClient单例上重新加载凭据,c#,azure-cognitive-search,azure-search-.net-sdk,C#,Azure Cognitive Search,Azure Search .net Sdk,在我们的web应用依赖注入中,我们将.NET Azure Search SDK的SearchServiceClient.Indexes.GetClient(…)返回的ISearchIndexClient实例配置为单例 我们这样做是因为答案提到这些类共享一个HTTP客户机。为了避免端口耗尽,我们需要一个共享的HttpClient 然而,问题是,这意味着我们需要重新启动web应用程序,以便从KeyVault重新加载新的查询密钥(机密)。考虑一个秘密的旋转流:我们需要重新启动/重新部署我们的Web应用

在我们的web应用依赖注入中,我们将.NET Azure Search SDK的
SearchServiceClient.Indexes.GetClient(…)
返回的
ISearchIndexClient
实例配置为单例

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

然而,问题是,这意味着我们需要重新启动web应用程序,以便从KeyVault重新加载新的查询密钥(机密)。考虑一个秘密的旋转流:我们需要重新启动/重新部署我们的Web应用程序后,把新的秘密在密钥库,但在无效旧的秘密。 Azure Search.NET SDK是否建议使用工厂或其他模式定期获取新的
SearchServiceClient
ISearchIndexClient
?出于性能方面的考虑,我大部分时间都想要一个单例,但我希望每隔几个小时就有一个新实例(例如)

我们的代码现在看起来像这样。它使用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();
containerBuilder
.寄存器(c=>
{
var options=c.Resolve();
返回新的SearchServiceClient(
options.Value.SearchServiceName,
新的SearchCredentials(options.Value.SearchServiceApiKey));
});
集装箱船
.寄存器(c=>
{
var serviceClient=c.Resolve();
var options=c.Resolve();
返回serviceClient.index.GetClient(options.Value.SearchIndexName);
})
.SingleInstance();

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

SearchIndexClient
实例实现自己的工厂/池是一个不错的选择。不幸的是,SDK中不包含此类功能,因此您必须自行开发。

明白。这不是我最喜欢的答案,但如果这是必须的,那么我们将考虑在未来实施一个因素。目前,我们将在秘密轮换后重新部署web应用程序。最终,我们计划支持MSI和AAD,这样您就不必轮换自己的秘密。不过还没有时间表。