HttpClientFactory с динамическими конфигурациями - PullRequest
0 голосов
/ 14 ноября 2018

Я работаю над основным веб-приложением .net, которому необходимо вызывать удаленные API через определенные интервалы ( каждые 2 минуты, 20 различных вызовов API и мне нужно показывать результаты API конечным пользователям), размещенное на 4 разных доменных имени

Я использовал HttpClient для вызова удаленных API. Но с увеличением количества пользователей загрузка процессора увеличилась до 40%. Я подозреваю, что причиной может быть HttpClient. Пройдя несколько блогов, я пытаюсь использовать HttpClientFactory.
У меня есть один метод, который получает вызов от действия контроллера, и мне нужно динамически идентифицировать BaseUrl на основе нескольких параметров. В настоящее время я создал 4 NamedClients в StartUp.cs следующим образом:

   services.AddHttpClient(ApiConfig.NamedHttpClients.TestUrl1, client =>
       {
           client.BaseAddress = new Uri(Configuration.GetSection("BaseUrls").GetSection("TestUrl1").Value);
           client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
           client.DefaultRequestHeaders.Add("Authorization", "Basic " + ApiConfig.GetEncodedCredentials(Configuration));
           var userAgent = "C# app";
           client.DefaultRequestHeaders.Add("User-Agent", userAgent);
       }).SetHandlerLifetime(TimeSpan.FromMinutes(5));
        services.AddHttpClient(ApiConfig.NamedHttpClients.TestUrl2, client =>
        {
            client.BaseAddress = new Uri(Configuration.GetSection("BaseUrls").GetSection("TestUrl2").Value);
            client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
            client.DefaultRequestHeaders.Add("Authorization", "Basic " + ApiConfig.GetEncodedCredentials(Configuration));
            var userAgent = "C# app";
            client.DefaultRequestHeaders.Add("User-Agent", userAgent);
        });

И затем использовать в классе, как это:

  public class Service : IService
{
    private readonly IHttpClientFactory httpClientFactory;
    public Service(IHttpClientFactory clientFactory)
    {
        httpClientFactory = clientFactory;
    }
    public HttpResponseMessage GetApiClientResponse(string displayName, IConfiguration configuration, HttpRequest httpRequest)
    {
        var endPoint = ApiConfig.GetApiDetail(configuration).
                            SingleOrDefault(ep => ep.DisplayName.ToLower().Equals(displayName.ToLower()));
        var client = httpClientFactory.CreateClient(endPoint.NamedClient);
        HttpResponseMessage response = null;
        try
        {
            response = client.GetAsync(new Uri(endPoint.EndPointName,UriKind.Relative), HttpCompletionOption.ResponseHeadersRead).Result;
        }
        catch { ...}
        return response;
    }
}

здесь, основываясь на параметре displayname, я могу решить, какой NamedClient будет использоваться.
Есть ли другой эффективный способ достижения требуемой функциональности? Могу ли я использовать TypedClient вместо этого?

...