Как мне вызвать HttpClient в сервисе для клиентского приложения Blazor

Я хочу совершать Http-звонки из службы в Blazor, а не звонить в @code блок в .razor файл ни в коде позади. Я получаю ошибку:
Shared/WeatherService.cs(16,17): error CS0246: The type or namespace name 'HttpClient' could not be found (are you missing a using directive or an assembly reference?)

Документация показывает, что это так.

Комплексные услуги могут потребовать дополнительных услуг. В предыдущем примере для DataAccess может потребоваться служба по умолчанию HttpClient. @inject (или InjectAttribute) недоступен для использования в службах. Вместо этого необходимо использовать конструктор. Требуемые сервисы добавляются путем добавления параметров в конструктор сервиса. Когда DI создает сервис, он распознает сервисы, которые ему требуются в конструкторе, и предоставляет их соответствующим образом.

Источник: https://docs.microsoft.com/en-us/aspnet/core/blazor/dependency-injection?view=aspnetcore-3.0

Как мне исправить ошибку?

// WeatherService.cs
using System.Threading.Tasks;

namespace MyBlazorApp.Shared
{
    public interface IWeatherService
    {
        Task<Weather> Get(decimal latitude, decimal longitude);
    }

    public class WeatherService : IWeatherService
    {
        public WeatherService(HttpClient httpClient)
        {
            ...
        }

        public async Task<Weather> Get(decimal latitude, decimal longitude)
        {
            // Do stuff
        }

    }
}
// Starup.cs
using Microsoft.AspNetCore.Components.Builder;
using Microsoft.Extensions.DependencyInjection;
using MyBlazorApp.Shared;

namespace MyBlazorApp
{
    public class Startup
    {
        public void ConfigureServices(IServiceCollection services)
        {
            services.AddSingleton<IWeatherService, WeatherService>();
        }

        public void Configure(IComponentsApplicationBuilder app)
        {
            app.AddComponent<App>("app");
        }
    }
}

1 ответ

Решение

Вам не хватает using System.Net.Http; иметь доступ к классу в WeatherService.cs

// WeatherService.cs
using System.Threading.Tasks;
using System.Net.Http; //<-- THIS WAS MISSING

namespace MyBlazorApp.Shared {
    public interface IWeatherService {
        Task<Weather> Get(decimal latitude, decimal longitude);
    }

    public class WeatherService : IWeatherService {
        private HttpClient httpClient;

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

        public async Task<Weather> Get(decimal latitude, decimal longitude) {
            // Do stuff
        }

    }
}

Если использовать полное имя для класса System.Net.Http.HttpClient не работает то вы точно пропустите ссылку на сборку.

Вы можете настроить httpclient в startup.cs.

    services.AddHttpClient();
    services.AddScoped<HttpClient>();

Теперь вы можете использовать HttClient в файлах.razor.

@inject HttpClient httpClient

-------------

private async Task LoadSystems() => systemsList = await httpClient.GetJsonAsync<List<Models.Systems>>("Systems/GetSystems");
Другие вопросы по тегам