【问题标题】:Making HTTP Call without Dependency Injection in .NET Core在 .NET Core 中进行没有依赖注入的 HTTP 调用
【发布时间】:2021-10-27 22:33:56
【问题描述】:

我需要进行一系列 HTTP 调用以从第 3 方保管库获取数据库凭据,因为我需要在添加 DBContext 之前在 Program.cs 或最迟在 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();

但是这似乎不起作用,并且根据this question 它不应该像那样实例化。

【问题讨论】:

    标签: c# .net-core httpclientfactory


    【解决方案1】:

    您不需要注入键入的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 来解决其中的一些配置问题,因此它实现了IConfigurationBuilderIConfigurationRoot 并让您能够部分构建 sourceproviders,解析并再次添加到构建器中。

    这解决了需要以一致的方式解析和构建配置的用例。例如,您可以使用 Manager 来解析 配置,启动 Service Provider 并解析依赖项以调用远程资源,以及然后将更多配置添加到IConfigurationRoot

    【讨论】:

    • 在做_configuration = new ConfigurationBuilder().Build();时需要手动添加appsettings.json作为来源吗?在执行_configuration["CredentialsVault:apiKey"] 时,它返回null,我可以通过从 Program.cs 传递配置实例来使其工作。
    • 是的,您需要将任何 json 配置作为源添加到新的 peeconfiguraiton 才能使用它
    猜你喜欢
    • 2017-06-09
    • 1970-01-01
    • 2016-05-22
    • 1970-01-01
    • 2021-07-15
    • 2021-10-23
    • 1970-01-01
    • 2021-02-02
    • 1970-01-01
    相关资源
    最近更新 更多