如何在运行时重新加载 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" 范围,您将拥有一个具有最新设置的客户端,但基本上每次使用都会得到一个客户端,这可能并不理想。
我是 运行 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" 范围,您将拥有一个具有最新设置的客户端,但基本上每次使用都会得到一个客户端,这可能并不理想。