Использование HttpClient на стороне сервера Blazor для получения StatusCode 407 AuthenticationRequired - PullRequest
0 голосов
/ 24 октября 2019

Я пытаюсь получить доступ к WebApi из проекта на стороне сервера Blazor, настроив HttpClient, как показано ниже, но я всегда получаю:

{StatusCode: 407, ReasonPhrase: 'authenticationrequired', Version: 1.1, Content: System.Net.Http.HttpConnectionResponseContent, Headers:{  Date: Thu, 24 Oct 2019 11:01:00 GMT  Cache-Control: no-cache  X-Frame-Options: deny  Proxy-Connection: Keep-Alive  Proxy-Authenticate: NTLM  Content-Type: text/html  Content-Length: 3851}}
           services.AddHttpClient<IUsersService, HttpUsersService>(options =>
            {
                options.BaseAddress = new Uri("https://api.example.com/");
                options.DefaultRequestHeaders.Accept.Clear();
                options.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
            })
                .ConfigureHttpMessageHandlerBuilder(h =>
                    new HttpClientHandler
                    {
                        DefaultProxyCredentials = CredentialCache.DefaultCredentials,
                    });

private async Task<User> GetUser()
{
    var response = await _httpClient.GetAsync("v1/Users");

    var test = await response.Content.ReadAsStreamAsync();

    var model = await JsonSerializer.DeserializeAsync<User[]>(test);

    return model.First();
}

Есть ли способ получитьсистемный прокси и учетные данные или что я здесь не так делаю?

1 Ответ

3 голосов
/ 24 октября 2019

Где вы применяете этот код:

services.AddHttpClient<IUsersService, HttpUsersService>(options =>
            {
                options.BaseAddress = new Uri("https://api.example.com/");
                options.DefaultRequestHeaders.Accept.Clear();
                options.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
            })
                .ConfigureHttpMessageHandlerBuilder(h =>
                    new HttpClientHandler
                    {
                        DefaultProxyCredentials = CredentialCache.DefaultCredentials,
                    });

Я полагаю, в классе автозагрузки, верно?

ОК, так как вы упомянули выше, что вызываете веб-APIконечная точка из клиентского приложения Blazor, этот код не должен использоваться. Этот код, я полагаю, создает службу HttpClient из IHttpClientFactory. Это не имеет ничего общего со службой HttpClient, используемой в клиентском приложении Blazor, основанном на JavaScript Fetch API.

Однако платформа Blazor по умолчанию добавляет службу HttpClient в контейнер DI и всеВы должны сделать, чтобы использовать его, чтобы внедрить его в ваш компонент или сервис класса ...

Пример:

 @page "/"
    @inject HttpClient Http

    // more code... 

    @code {
        User[] users;

        // more code... 
    private async Task<User> GetUser()
    {
        users = await Http.GetJsonAsync<User[]>("v1/Users");
        return model.First();
    }

    }

Надеюсь, это поможет ...

...