Как мне вызвать 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");