【问题标题】:How to reload AWS options at runtime如何在运行时重新加载 AWS 选项
【发布时间】:2018-01-22 22:52:46
【问题描述】:

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

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

但这给出了一个例外:

System.InvalidOperationException:无法从根提供商解析范围服务“Amazon.Extensions.NETCore.Setup.AWSOptions”。

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

【问题讨论】:

    标签: c# asp.net-core asp.net-core-mvc aws-sdk aws-sdk-net


    【解决方案1】:

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

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

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

    【讨论】:

    • 看来“范围”可能是最好的选择,我只需要处理任何错误并重新提交任何失败的请求。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2013-06-01
    • 2016-11-03
    • 2010-10-19
    • 1970-01-01
    • 1970-01-01
    • 2013-04-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多