Серверный Blazor не предоставляет HttpClient для внедрения

#.net #inject #blazor-server-side

#.net #внедрить #blazor на стороне сервера

Вопрос:

Я получаю ошибку на странице razor при попытке внедрить HttpClient:

Отклонение необработанного обещания: Ошибка: Система.Исключение InvalidOperationException: не удается предоставить значение для свойства ‘Http’ в зависимости от типа . Не существует зарегистрированной службы типа ‘System.Net.Http.HttpClient’.

Пожалуйста, просмотрите и оставьте отзыв.

Ответ №1:

было бы проще ответить на ваш вопрос, если бы вы предоставили фрагменты кода, которые вы пытаетесь сделать. Но ладно. Сейчас я покажу вам на примере, что вам нужно сделать, чтобы внедрить службу с помощью DI.

 ChartDataService.cs


namespace MyBlazorApp.Services 
{

  public class ChartDataService: IChartDataService
  {
    public HttpClient httpClient;
    
    public ChartDataService(HttpClient httpClient) 
    {
      this.httpClient = httpClient;
    }

    public async Task < IEnumerable < ChartData >> GetChartData()
    {
      return await httpClient.GetJsonAsync < ChartData[] > ($ "myUri");
    }
  }
}  

 IChartDataService.cs

namespace MyBlazorApp.Services 
{
  public interface IChartDataService 
  {
    Task < IEnumerable < ChartData >> GetChartData();
  }
}  

 Startup.cs
// other

public void ConfigureServices(IServiceCollection services) 
{
    services.AddRazorPages();
    services.AddServerSideBlazor();
    // some services
    services.AddHttpClient < IChartDataService, ChartDataService > (client => 
    {
      client.BaseAddress = new Uri(myBaseUri);
    });    
}  

 MyRazorPage.razor.cs (when using code Behind)

[Inject] private IChartDataService ChartDataService { get; set; }

or in
MyRazorPage.razor

@code
{
[Inject] private IChartDataService ChartDataService { get; set; }
}  

 then in your code - block or code - behind file u can use something like this,
  for example, in an async function..

protected override async Task OnInitializedAsync() 
{
  chartData = await ChartDataService.MakeChartData();
}  

Ответ №2:

В этом сообщении говорится, что вам необходимо зарегистрировать службу HTTP в файле Program.cs

Если вы используете Net6, вы можете зарегистрироваться с помощью этой строки:

 var builder = WebApplication.CreateBuilder(args);
builder.Services.AddHttpClient();
  

Ответ №3:

В Razor Component это не требуется для @inject

Смотрите пример ниже:

 <div class="row">
    <div class="col-4">
        <label for="cities">Choose city</label>
        <input type="text" class="form-control" id="citiy" @bind="@cityName" />         
    </div>
    <div class="col-3">
        <button class="btn btn-primary" @onclick=@GetWeather>Get weather for @cityName</button>
    </div>
</div>
<div class="row">
    <div class="col-8 offset-2">
        <pre id="json"><code>@ResultStr</code></pre>
   </div>
</div>
  

И @code часть

 @code {

    string cityName = "";
    string ResultStr= "...";
    string reqUrl => $"http://api.openweathermap.org/data/2.5/weather?q={cityName}amp;APPID=appID";

    async Task GetWeather()
    {
        try
        {
            HttpClient client = new HttpClient();
            ResultStr= "...";
            var response = await client.GetAsync(reqUrl);
            if (response.IsSuccessStatusCode)
                ResultStr= await response.Content.ReadAsStringAsync();
            else
                ResultStr= response.ReasonPhrase;
        }
        catch (Exception ex)
        {
             ResultStr= ex.ToString();
        }
    }
}
  

У меня это сработало .. =)

Комментарии:

1. В Blazor рекомендуется вводить HttpClient' не new HttpClient ()