当前位置: 首页 > 知识库问答 >
问题:

解析不同的HttpClient

松烨烨
2023-03-14

鉴于以下类:

public class HttpHelper
{
    private readonly HttpClient client;
    public HttpHelper(HttpClient client)
    {
        this.client = client;
    }
}

public class ServiceA
{
    private readonly HttpHelper helper;
    public ServiceA(HttpHelper helper)
    {
        this.helper = helper;
    }
 }

 public class ServiceB
 {
    private readonly HttpHelper helper;
    public ServiceB(HttpHelper helper)
    {
        this.helper = helper;
    }
}

和以下设置:

      sc.AddSingleton<ServiceA>()
         .AddHttpClient<HttpHelper>()
         .ConfigureHttpClient((sp, client) => { client.BaseAddress = new Uri("http://domainA"); });

      sc.AddSingleton<ServiceB>()
        .AddHttpClient<HttpHelper>()
        .ConfigureHttpClient((sp, client) => { client.BaseAddress = new Uri("http://domainB"); });

当我尝试解析ServiceA和ServiceB时,它们都得到一个具有相同URL的HttpClient。

我如何更改DI中的注册,使每个服务都得到正确的HttpClient注入?

TIA

/Søren

共有2个答案

白学
2023-03-14

另一种方法是按命名工厂进行配置:

//configure your clients
services.AddHttpClient("clientName1", client => { 
   //configure
});

services.AddHttpClient("clientName2", client => { 
   //configure
});

//configure your services
services.AddScoped<ServiceA>(sp =>
    {
        var client = sp.GetRequiredService<IHttpClientFactory>()
            .CreateClient("clientName1");
        return new ServiceA(client);
    });

services.AddScoped<ServiceB>(sp =>
    {
        var client = sp.GetRequiredService<IHttpClientFactory>()
            .CreateClient("clientName2");
        return new ServiceB(client);
    });

这种方法的一个问题是,您需要明确定义服务A和B的解析器。

关宏毅
2023-03-14

我宁愿做这样的事。

public class ServiceA
    { 
        private readonly HttpClient httpClient;

        public ServiceA(HttpClient httpClient)
        { 
            this.httpClient = httpClient;
        }
    }
    public class ServiceB
    {       
        private readonly HttpClient httpClient;
        public ServiceB(HttpClient httpClient)
        {            
            this.httpClient = httpClient;
        }
    }

和ConfigureService。

services.AddHttpClient<ServiceA>().ConfigureHttpClient(client =>
            {
                client.BaseAddress = new Uri("http://domainA");
            });
            services.AddHttpClient<ServiceB>().ConfigureHttpClient(client =>
            {
                client.BaseAddress = new Uri("http://domainB");
            });

注:

在你的情况下,有两件事是有问题的。

  1. AddSingletonfor ServiceA和ServiceB
  2. 由于AddHttpClient变为单例且只有一个get被启动,因此出现问题。
 类似资料:
  • 我们正计划将Graphql用于编排(For e.用户界面客户端调用图形ql服务,该服务转到多个Restendpoint并返回结果)。这里的问题是,从一个Restendpoint,我们必须根据客户端请求的字段传递不同类型的查询参数。 我们使用Spring Bootgraphql和graphql java工具库来初始化graphql 我的代码解析用户字段并调用restendpoint,以便在一次调用(

  • 我一直在阅读graphQL文档,发现它们以两种方式解释了graphQL服务器的实现:一种是使用graphQL瑜伽,这是一种功能齐全的graphQL服务器,另一种是使用graphQL、express graphQL和express。在这两种情况下,我们在创建服务器实例时传递模式和解析器函数。 但是解析器函数的实现是不同的。使用graphql瑜伽时,解析器函数提供了4个参数,其中包含有关父对象、接收的

  • 问题内容: 我正在尝试从服务器解析JSON响应,如果在post方法中发送的查询中有更改,我将第一个作为响应,否则,我将第二个作为响应。 1: 2: 如您所见,返回对象是否更改,如果没有更改,则返回字符串。 我正在使用这种方法来获取数据,并且我正在使用Gson Converter来映射数据。 这是请求界面 这是我的POJO课 最后我进行了改造电话: 问题答案: 谢谢您的建议,但我想出了一种可行的方法

  • 我遇到了一个奇怪的问题,我的Maven文件中有两个依赖项,它们都定义了。我遇到的问题是,我的一个依赖项显然使用了代码所期望的不同版本,它会抛出and错误。 我的代码正在从Tika依赖项获取类,这导致了问题。我希望它来自我定义的,这是正确的版本。它似乎也忽略了文件中依赖项的排序。

  • 我在ES7.8中创建了一个日期格式为“YYYY-MM-DD”的索引。 然而,当我点击地图上的“基线”字段时,在Filter上传递的实际值是yyyy-mm-dd00:00:00.000z。 有没有人可以建议一下,我怎样才能在过滤器中得到正确的日期格式“YYYY-MM-DD”? 多谢了。 下面是请求中的示例文档 “命中”:[{“_index”:“program_b”,“_type”:“_doc”,“_

  • 我有一个POJO,它有一个字段: 当将一个json响应解析到这个资产POJO中时,一切工作都很完美。但是,与此资产附带的关键字有一个细微的区别。它可以是: 或 有没有一种方法来注释POJO来识别这个案例并反序列化到相同的字段中。两者不可能出现在相同的答复中。