如何在运行时重新加载 AWS 选项

How to reload AWS options at runtime

我是 运行 ASP.NET Core MVC 应用程序,位于 docker 容器中,带有 AWS 凭证文件。我有另一项服务,当旧密钥过期时将新密钥放入文件中,但这些新密钥似乎没有传播到我的 MVC 应用程序,我的网站崩溃了。我已经看到通常要重新加载强类型配置的解决方案是使用 IOptionsSnapshot,例如:

services.AddDefaultAWSOptions(Configuration.GetAWSOptions())
        .AddScoped(config => config.GetService<IOptionsSnapshot<AWSOptions>>().Value)
        .AddAWSService<IAmazonS3>();

但这给出了一个例外:

System.InvalidOperationException: Cannot resolve scoped service 'Amazon.Extensions.NETCore.Setup.AWSOptions' from root provider.

有没有人有让 ASP 重新加载 AWS 凭证文件的解决方案?如果可能,我想继续使用 AWS 依赖项注入扩展。

默认情况下,AddAWSService 在单例范围内注册客户端工厂,这意味着它在应用程序的生命周期内完成。但是,AddAWSService 有一个 lifetime 参数,您可以使用它来自定义它。本质上,您需要缩短客户端的生命周期,以便使用新设置重新创建它。您可以选择 "scoped"(请求范围)或 "transient"(每次注入新实例)。

显然,使用 "scoped",您将在每次请求时获得与更新设置的连接。但是,如果您在更改设置后对同一请求进行任何进一步的操作,它将保持与旧设置的旧连接(即您仍然会遇到同样的问题,至少在请求的生命周期内)。

使用 "transient" 范围,您将拥有一个具有最新设置的客户端,但基本上每次使用都会得到一个客户端,这可能并不理想。