#.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 ()