Аутентификация по запросу с использованием HttpClientFactory .net Core 2.1 - PullRequest
0 голосов
/ 01 февраля 2019

Как мне использовать HttpClientFactory для возврата экземпляра HttpClient, чьи URI и учетные данные определены в точке вызова?

Существующий код выглядит следующим образом:

var httpClientHandler = new HttpClientHandler()
    {
        Credentials = new NetworkCredential(userName, password),
    };
HttpClient client = new HttpClient(httpClientHandler);
client.BaseAddress = new Uri(_appSetting.ServiceURI);

Ответы [ 2 ]

0 голосов
/ 13 июня 2019

Если вы используете .net Dependency Injection, вы можете добавить конфигурацию для одного класса в ваш установочный код:

services
    .AddTransient<DataLoader>()
    .AddHttpClient<DataLoader>().ConfigurePrimaryHttpMessageHandler(() => new HttpClientHandler()
{
    Credentials = new NetworkCredential(LoadUsernameFromConfig(), LoadPasswordFromSecureLocation())
});

Добавить сейчас DI будет вводить HttpClient, который использует эти учетные данные в DataLoader класс:

    public class DataLoader
    {
        private readonly HttpClient httpClient;

        public DataLoader(HttpClient httpClient)
        {
            this.httpClient = httpClient;
        }

        public async Task LoadData(string tableName)
        {
            var json = await httpClient.GetStringAsync("https://protected.example.com/json");
            ...
        }
    }

(я бы не смог придумать этот код, если бы у меня не было ответа от Имран Аршад : Спасибо!)

0 голосов
/ 01 февраля 2019

ваш метод ConfigureServices в классе запуска

             services.AddHttpClient("github", c =>
            {
                //c.BaseAddress = new Uri("https://api.github.com/");
                c.DefaultRequestHeaders.Add("Accept", "application/vnd.github.v3+json");
                c.DefaultRequestHeaders.Add("User-Agent", "HttpClientFactory-Sample");
                
            }).ConfigurePrimaryHttpMessageHandler(() =>
            {
                return new HttpClientHandler()
                {
                    UseDefaultCredentials = true,
                    Credentials = new NetworkCredential("", ""),
                };
            });

Ваш контроллер будет выглядеть так

 private readonly IHttpClientFactory _httpClientFactory;

        public DataProController(IHttpClientFactory httpClientFactory)
        {
            _httpClientFactory = httpClientFactory;
        }

        [HttpGet]
        public async Task<ActionResult> Get()
        {            
            var client = _httpClientFactory.CreateClient("github");
            
            client.BaseAddress = new Uri("https://api.github.com/");

            string result = await client.GetStringAsync("/");
            return Ok(result);
        }

Возможно, вам не удастся настроить сетевые учетные данные во время выполнения при использовании httpclientfactory и, возможно, потребуется настроить их в классе запуска.Вы можете найти об этой проблеме здесь.https://github.com/aspnet/HttpClientFactory/issues/71

...