Как определить HttpClientHandler для именованного HttpClient с помощью HttpClientFactory

Старый код:

Client = new HttpClient(new HttpClientHandler() { DefaultProxyCredentials = CredentialCache.DefaultNetworkCredentials });

// set an default user agent string, some services does not allow emtpy user agents
if (!Client.DefaultRequestHeaders.Contains("User-Agent"))
    Client.DefaultRequestHeaders.TryAddWithoutValidation("User-Agent", "Mozilla/5.0");

Попытка реализовать то же самое с помощью нового ASP.NET Core 2.1 HttpClientFactory:

services.AddHttpClient("Default", client =>
        {
            client.DefaultRequestHeaders.Add("User-Agent", "Mozilla/5.0");
        }).ConfigurePrimaryHttpMessageHandler(handler => new HttpClientHandler() { DefaultProxyCredentials = CredentialCache.DefaultNetworkCredentials });          

К сожалению, я получаю ошибку HTTP 407 (Proxy Auth). Что я делаю неправильно?


person Toni Wenzel    schedule 26.06.2018    source источник
comment
Как ваш вопрос не имеет больше голосов? При поиске в гугле почти ничего нет.   -  person Robert Stokes    schedule 22.05.2020


Ответы (1)


Обычно рекомендуется иметь статический класс, содержащий строковые константы для имен клиентов.

Что-то вроде:

public static class NamedHttpClients {
    public const string Default = "Default";
}

Затем убедитесь, что именованный клиент настроен правильно, что в вашем конкретном случае будет выглядеть так:

services
    .AddHttpClient(NamedHttpClients.Default, client => {
        client.DefaultRequestHeaders.Add("User-Agent", "Mozilla/5.0");
    })
    .ConfigurePrimaryHttpMessageHandler(() => new HttpClientHandler() { 
        DefaultProxyCredentials = CredentialCache.DefaultNetworkCredentials 
    }); 

Оттуда вы можете получить клиент от внедренного IHttpClientFactory

var client = httpClientFactory.CreateClient(NamedHttpClients.Default);

и используется по назначению.

person Nkosi    schedule 26.06.2018