#c# #razor #blazor #webassembly
Вопрос:
в файле .razor я использую
@inject HttpClient Http
чтобы получить доступ к HttpClient.
Есть ли способ сделать то же самое в файле .cs или мне нужно передать его в качестве параметра?
Обновить
Я думал, что у меня это есть, но это не так.
Использование операторов
using System.Net.Http;
using Microsoft.AspNetCore.Components;
using System.Net.Http.Json;
определяется как параметр класса
[Inject]
protected HttpClient Http {get;set;}
в моей задаче вызова
await Http.GetFromJsonAsync<SharedGLAccount[]>($"api/{ST_comp}/GLAccounts")
появляется следующая ошибка
Microsoft.AspNetCore.Components.WebAssembly.Rendering.WebAssemblyRenderer[100]
Unhandled exception rendering component: Value cannot be null. (Parameter 'client')
Комментарии:
1. в cs-файле вы делаете
HttpClient client = new HttpClient();
, а затем вызываете методы дляclient
объекта.2. Проверьте Инъекцию зависимости
3. да, спасибо, я думаю, что нашел его, я добавлю ответ, как только проверю
Ответ №1:
Я предлагаю вам использовать IHttpClientFactory
для этого. Ознакомьтесь с этой документацией, которая объясняет преимущества ее использования, а также скопирована ниже:
- Обеспечивает центральное расположение для именования и настройки логических
HttpClient
экземпляров. Например, клиент с именем github может быть зарегистрирован и настроен для доступа к GitHub. Клиент по умолчанию может быть зарегистрирован для общего доступа.- Кодифицирует концепцию исходящего промежуточного программного обеспечения путем делегирования обработчиков
HttpClient
. Предоставляет расширения для промежуточного программного обеспечения на основе Polly, позволяющие использовать преимущества делегирования обработчиковHttpClient
.- Управляет объединением и временем жизни базовых
HttpClientMessageHandler
экземпляров. Автоматическое управление позволяет избежать распространенных проблем DNS (системы доменных имен), возникающих при ручном управленииHttpClient
временем жизни.- Добавляет настраиваемый интерфейс ведения журнала (через
ILogger
) для всех запросов, отправляемых через клиентов, созданных фабрикой.
Примером использования является:
В файле startup.cs:
public class Startup
{
public Startup(IConfiguration configuration)
{
Configuration = configuration;
}
public IConfiguration Configuration { get; }
public void ConfigureServices(IServiceCollection services)
{
services.AddHttpClient(); // <- add this
Вы можете внедрить это с помощью класса службы или репозитория:
public class BasicService : IBasicService
{
private readonly IHttpClientFactory _httpClientFactory;
public BasicUsageModel(IHttpClientFactory httpClientFactory) // <- inject here
{
_httpClientFactory = httpClientFactory;
}
или это, если его код страницы бритвы за:
[Inject] public IHttpClientFactory HttpClientFactory { get; set; }
или это, если его страница razor:
@inject IHttpClientFactory HttpClientFactory
И используйте его вот так:
var httpClient = _clientFactory.CreateClient(); // <- create HTTP client
Комментарии:
1. Спасибо за подробное объяснение! Целесообразно ли создавать новые для каждого звонка? или лучше использовать повторно?