.NET Core中无需依赖注入发起HTTP请求提前获取数据库凭据的方案咨询
方案1:启动配置阶段直接使用HttpClient
应用启动的配置阶段是单次执行场景,不会高频创建HttpClient实例,因此只要控制实例创建次数,完全可以直接实例化HttpClient,不会出现常规场景下的套接字耗尽问题。
如果之前直接实例化无法正常运行,可优先检查是否是TLS版本不兼容、请求超时未配置导致的,参考正确示例:
// 全局静态实例,整个启动流程仅创建一次 private static readonly HttpClient _vaultClient = new HttpClient { Timeout = TimeSpan.FromSeconds(30) }; // 调用前可按需指定TLS版本,适配第三方接口要求 System.Net.ServicePointManager.SecurityProtocol = System.Net.SecurityProtocolType.Tls12 | System.Net.SecurityProtocolType.Tls13; var request = new HttpRequestMessage(HttpMethod.Post, $"{_configuration["CredentialsVault:vaultUrl"]}Auth/SignAppIn"); request.Headers.Add("Authorization", $"PS-Auth key={_apiKey}; runas={_runAsUser};"); using var response = await _vaultClient.SendAsync(request); response.EnsureSuccessStatusCode(); // 解析响应获取数据库凭据即可
方案2:延迟DbContext配置,使用IHttpClientFactory
AddDbContext 支持传入带服务提供器的工厂重载,配置逻辑会延迟到首次解析DbContext时执行,此时DI容器已经完成初始化,可直接获取IHttpClientFactory实例,完全符合官方规范:
// 先正常注册IHttpClientFactory builder.Services.AddHttpClient(); // 注册DbContext时使用服务提供器重载 builder.Services.AddDbContext<你的DbContext类名>((serviceProvider, options) => { // 从已初始化的DI容器获取依赖 var httpClientFactory = serviceProvider.GetRequiredService<IHttpClientFactory>(); var config = serviceProvider.GetRequiredService<IConfiguration>(); // 调用第三方保管库接口获取凭据 var client = httpClientFactory.CreateClient(); var request = new HttpRequestMessage(HttpMethod.Post, $"{config["CredentialsVault:vaultUrl"]}Auth/SignAppIn"); request.Headers.Add("Authorization", $"PS-Auth key={config["CredentialsVault:ApiKey"]}; runas={config["CredentialsVault:RunAsUser"]};"); var response = client.SendAsync(request).GetAwaiter().GetResult(); response.EnsureSuccessStatusCode(); var connectionString = response.Content.ReadFromJsonAsync<string>().GetAwaiter().GetResult(); // 配置数据库连接 options.UseSqlServer(connectionString); });
如果需要减少接口调用次数,可自行添加内存缓存逻辑,将拉取到的凭据缓存至指定有效期,避免每次解析DbContext都发起请求。
内容的提问来源于stack exchange,提问作者Danyx
相关产品推荐
相关产品推荐

