定期重新加载 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 是否推荐工厂或其他模式来定期获取新的 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();
我可以建立一个基于时间的工厂,不时吐出一个新的 SearchServiceClient
或 ISearchIndexClient
,但我希望有些东西已经存在。
为 SearchIndexClient
个实例实施您自己的 factory/pool 是可行的方法。遗憾的是,此类功能未包含在 SDK 中,因此您必须自己动手。
在我们的 Web 应用程序依赖项注入中,我们将 .NET Azure 搜索 SDK 的 SearchServiceClient.Indexes.GetClient(...)
返回的 ISearchIndexClient
个实例配置为单例。
我们这样做是因为答案 HttpClient
.
但是,问题在于这意味着我们需要重新启动 Web 应用程序才能从 KeyVault 重新加载新的查询密钥(秘密)。考虑一个秘密轮换流程:在将新秘密放入 KeyVault 之后但在使旧秘密无效之前,我们需要 restart/redeploy 我们的 Web 应用程序。
Azure 搜索 .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();
我可以建立一个基于时间的工厂,不时吐出一个新的 SearchServiceClient
或 ISearchIndexClient
,但我希望有些东西已经存在。
为 SearchIndexClient
个实例实施您自己的 factory/pool 是可行的方法。遗憾的是,此类功能未包含在 SDK 中,因此您必须自己动手。