gpt4 book ai didi

.net - 在azure函数应用程序启动时读取应用程序配置

转载 作者:行者123 更新时间:2023-12-03 02:00:03 25 4
gpt4 key购买 nike

我试图了解如何在进程内模型中使用 dotnet 在 Azure Function App 的 Startup.cs 中正确配置服务。

我在 local.settings.json 中有几个参数(在 Azure 中托管时具有相同的值)

"MyOptions:BaseAddress": "https://dev.azurewebsites.net/api/",
"MyOptions:Scope": "xxx/.default",

在扩展方法中,我将其连接如下:

private static IServiceCollection AddOptions(this IServiceCollection services)
{
return services.AddOptions<MyOptions>()
.Configure<IConfiguration>((settings, configuration) =>
{
configuration.GetSection(nameof(MyOptions)).Bind(settings);
})
.PostConfigure(opt => opt.ThrowIfValuesNotSet())
.Services;
}

配置选项后,我想配置一个至少应使用基地址的类型化 http 客户端:

services
.AddOptions()
.AddHttpClient<IMyService, MyService>(client =>
{
client.BaseAddress = <value from options>;
}
)

不过,我真的不知道如何实现这一点,而我最接近的只是从环境中读取,而不是依赖于读取配置的类:

var baseAddress = new Uri(Environment.GetEnvironmentVariable($"{nameof(MyOptions)}:BaseAddress"));

我稍后在委托(delegate)处理程序中使用相同的选项来管理正在调用的服务的授权,但我可以像往常一样使用 DI:

public class MyAuthorizationHandler : DelegatingHandler
{
private readonly TokenCredential _credential;
private readonly MyOptions _options;

public MyAuthorizationHandler(TokenCredential credential, IOptions<MyOptions> options)
{
_credential = credential;
_options = options.Value;
}

protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
{
var token = await _credential.GetTokenAsync(
new TokenRequestContext(new[]
{
_options.Scope
}), cancellationToken);

request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", token.Token);
return await base.SendAsync(request, cancellationToken);
}
}

我知道我可以从 IFunctionsHostBuilder 访问 IConfiguration,但是按照为 IServiceCollection 编写扩展方法的模式,它会变得有点很麻烦,因为我必须将 IConfiguration 实例传递给所有方法调用。

是否有推荐的方法来实现这一目标?

更新

正如评论中向我指出的那样,添加可以访问提供程序的 http 客户端时会出现许多重载:

.AddHttpClient<IMyService, MyService>((provider, client) =>
{
client.BaseAddress =
new Uri(provider.GetRequiredService<MyOptions>().BaseAddress);
})

最佳答案

正如评论中向我指出的,添加 http 客户端时有许多可用的重载。其中之一完全实现了我所寻找的目标,例如访问提供者:

services
.AddOptions()
.AddHttpClient<IMyService, MyService>((provider, client) =>
{
client.BaseAddress =
new Uri(provider.GetRequiredService<IOptions<MyOptions>>().BaseAddress);
})

private static IServiceCollection AddOptions(this IServiceCollection services)
{
return services.AddOptions<MyOptions>()
.Configure<IConfiguration>((settings, configuration) =>
{
configuration.GetSection(nameof(MyOptions)).Bind(settings);
})
.PostConfigure(opt => opt.ThrowIfValuesNotSet())
.Services;
}

请注意,您必须使用 IOptions<MyClass> 解析您的选项类。因为我们使用 AddOptions 将其添加到服务集合中.

关于.net - 在azure函数应用程序启动时读取应用程序配置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/76603992/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com