在 .NET Core 中进行 HTTP 调用而无需依赖注入

Dan*_*nyx 2 c# dotnet-httpclient .net-core httpclientfactory

我需要进行一系列 HTTP 调用以从第 3 方保管库获取数据库凭据,因为我需要运行此代码Program.cs,或者最晚Startup.cs在添加 DBContext 之前,我需要能够在不使用 DBContext 的情况下进行这些调用使用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);
Run Code Online (Sandbox Code Playgroud)

有没有一种方法可以在不依赖依赖注入的情况下进行 HTTP 调用,或者延迟AddDbContext到依赖注入设置之后?

我尝试创建一个 HttpClient 实例,如下所示:

HttpClient client = new HttpClient();
Run Code Online (Sandbox Code Playgroud)

然而,这似乎不起作用,根据这个问题,它不应该像这样实例化。

AAA*_*ddd 5

您不需要注入类型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
Run Code Online (Sandbox Code Playgroud)

如果需要,上述方法还使您能够灵活地将处理程序插入到请求链中。

但是,这可能不是您的问题。根据您的问题,您所需要做的就是使用标准进行相同的调用HttpClient,并以您已经调用它的方式进行调用。ConfigurationBuilder如果您需要解析配置,您可以再次启动 a 。

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
Run Code Online (Sandbox Code Playgroud)

有趣的事实

.net 6添加了ConfigurationManager来解决其中一些配置问题,因此它实现了IConfigurationBuilderIConfigurationRoot,并且使您能够部分构建提供程序,以解决并再次添加到构建器。

这解决了需要以一致的方式解析和构建配置的用例。例如,您可以使用Manager解析配置、启动服务提供程序并解析依赖项以调用远程资源,然后向IConfigurationRoot.