C# 在何处为测试和Live配置HttpClient

C# 在何处为测试和Live配置HttpClient,c#,asp.net-core,dependency-injection,asp.net-core-mvc,dotnet-httpclient,C#,Asp.net Core,Dependency Injection,Asp.net Core Mvc,Dotnet Httpclient,这听起来像是一个非常基本和常见的问题,但我找不到明确的答案,我尝试了各种方法。我正在使用ASP.NET内核。我想配置HttpClient,其中包括将SslProtocol设置为Tls12 这将不起作用,因为services.AddHttpClient要求类通过注入获取HttpClient public class BluePayHttpClient : HttpClient { public BluePayHttpClient() : base(new HttpClientHandler

这听起来像是一个非常基本和常见的问题,但我找不到明确的答案,我尝试了各种方法。我正在使用ASP.NET内核。我想配置HttpClient,其中包括将SslProtocol设置为Tls12

这将不起作用,因为
services.AddHttpClient
要求类通过注入获取HttpClient

public class BluePayHttpClient : HttpClient
{
    public BluePayHttpClient() : base(new HttpClientHandler()
    {
        AllowAutoRedirect = false,
        CheckCertificateRevocationList = true,
        SslProtocols = System.Security.Authentication.SslProtocols.Tls12
    })
    { }
}
如果我通过注射获取HttpClient。。。那么我无法在这里设置这些设置!因为HttpClientHandler必须在HttpClient的构造函数中设置

然后我可以在启动时设置这些设置,但是

  • 连接逻辑、协议、基址和类似的东西是特定模块的一部分,我更愿意将它们放在一起

  • 如果我在启动时设置它,那么它就不会被配置为集成测试!我需要复制配置代码,重复的代码不好

  • 最好的设置方法是什么

    如果我没有在BluePayHttpClient中配置这些基本选项,那么该类实际上没有做多少工作。。。我应该直接将HttpClient注入到使用它的类中吗<代码>服务。AddHttpClient确实感觉有点尴尬

    我应该直接将HttpClient注入到使用它的类中吗

    可以注册类型化客户机,也可以显式配置该类型的客户机

    services
        .AddHttpClient<IPaymentProcessor, PaymentProcessor>(c => {
            c.BaseAddress = new Uri("http://localhost:5000");
            //other client configuration here.
        })
        .ConfigurePrimaryHttpMessageHandler(() => {
            //configure handler
            return new HttpClientHandler() {
                AllowAutoRedirect = false,
                CheckCertificateRevocationList = true,
                SslProtocols = System.Security.Authentication.SslProtocols.Tls12
            };
        });
    
    服务
    .AddHttpClient(c=>{
    c、 BaseAddress=新Uri(“http://localhost:5000");
    //其他客户端配置在这里。
    })
    .ConfigurePrimaryHttpMessageHandler(()=>{
    //配置处理程序
    返回新的HttpClientHandler(){
    AllowAutoRedirect=false,
    CheckCertificatereJournalist=true,
    SslProtocols=System.Security.Authentication.SslProtocols.Tls12
    };
    });
    
    参考文献


    配置也可以在其特定模块中完成,并通过在启动时调用的扩展方法公开。

    阅读后,这里有一个更好的方法(您可能需要仔细阅读)

    使用
    Microsoft.AspNetCore.Mvc.Testing
    包可以构建依赖注入容器,从而像运行live一样测试服务配置链

    好处:

    • 无需复制HttpClient配置代码
    • 它测试整个DI容器配置
    • 它允许测试网页和控制器;或者测试常规课程
    缺点:

    • 泛型类库测试项目必须链接到前端Web项目才能读取配置,即使它被多个项目使用
    • 类库测试项目不能在其他web项目中使用

    总的来说。。。这似乎是一个很好的解决方案。

    我就是这么做的;在意识到连接不能用于集成测试之前。此外,这使我无法指定PaymentProcessor的作用域。它变成单身了吗?我可以回去复制配置代码,但一定有更好的方法吗?除非我调用启动代码作为集成测试的一部分。