我需要进行一系列HTTP调用以从第三方vault获取数据库凭据,鉴于我需要在Program.cs
中运行此代码,或者在添加DBContext之前运行Startup.cs
,我需要能够在不使用IHttpClientFactory
的情况下进行这些调用,因为这需要依赖注入已经初始化。
以下代码在运行时调用时可以正常工作,但在ConfigureAppConfiguration
步骤期间不能工作。
HttpClient client = _clientFactory.CreateClient();
HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Post, $"{_configuration["CredentialsVault:vaultUrl"]}Auth/SignAppIn");
request.Headers.Add("Authorization", $"PS-Auth key={_apiKey}; runas={_runAsUser};");
var response = await client.SendAsync(request);
是否有一种方法,我可以使HTTP调用,而不必依赖依赖注入,或延迟AddDbContext
,直到依赖注入已经建立?
我试着创建一个HttpClient的实例,像这样:
HttpClient client = new HttpClient();
然而,这似乎不起作用,根据这个问题,它不应该像那样实例化。
您不需要注入类型的HttpClient
,或者使用IHttpClientFactory
。建议使用来解决某些历史问题,但不是强制性的。
如果您确实需要解析依赖关系和配置以调用远程资源(在配置构造期间或之前),或者您有一个需要实例化的类型的客户端,您可以启动一个新的ConfigurationBuilder
(如果需要)和ServiceProvider
。
var preConfiguration = new ConfigurationBuilder()
//... add your sources
.Build();
var collection = new ServiceCollection()
.AddHttpClient<...>(...)
...
var provider = collection.BuildServiceProvider();
var client = provider.GetService<SomeClient>();
client.YourCall();
//... normal configuration here
上述方法还为您提供了在需要时向请求链插入处理程序的能力和灵活性。
然而,这可能不是你的问题。根据您的问题,您需要做的就是使用标准HttpClient
进行相同的调用,并以您已经调用的方式调用它。同样,如果需要解析配置,可以启动ConfigurationBuilder
。
var preConfiguration = new ConfigurationBuilder()
//... add your sources
.Build();
HttpClient client = new HttpClient();
HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Post, $"{preConfiguration["CredentialsVault:vaultUrl"]}Auth/SignAppIn");
request.Headers.Add("Authorization", $"PS-Auth key={_apiKey}; runas={_runAsUser};");
var response = await client.SendAsync(request);
//... normal configuration here
有趣的事实
.net 6添加了ConfigurationManager
来解决这些配置问题,因此它实现了IConfigurationBuilder
和IConfigurationRoot
,并使您能够部分构建源和提供者,以解决并依次添加到构建器中。
这解决了用例需要以一致的方式解析和构建配置。例如,您可以使用Manager解析配置,启动Service Provider并解析依赖项以调用远程资源,然后向IConfigurationRoot
添加更多配置。