Во-первых, в вашем веб-проекте вам необходимо выполнить небольшую настройку. Добавьте класс, как показано ниже:
public class ReferenceDataService
{
private readonly HttpClient _httpClient;
public ReferenceDataService(HttpClient httpClient)
{
_httpClient = httpClient ?? throw new ArgumentNullException(nameof(httpClient));
}
public async Task<List<ReferenceData>> GetReferenceDataAsync(CancellationToken cancellationToken = default)
{
using (var response = await _httpClient.GetAsync("/api/referencedata", cancellationToken))
{
if (response.IsSuccessStatusCode())
{
return await response.Content.ReadAsAsync<List<ReferenceData>>();
}
return null;
}
}
}
Затем в ConfigureServices
в Startup.cs
:
services.AddHttpClient<ReferenceDataService>(c =>
{
c.BaseAddress = new Uri("https://api.example.com");
// Use the actual URL for your API here. You also probably want to get this
// from `Configuration` rather than hard-coding it.
});
Наконец, введите ReferenceDataService
в ваш HomeController
:
public class HomeController : Controller
{
private readonly ReferenceDataService _referenceDataService;
public HomeController(ReferenceDataService referenceDataService)
{
_referenceDataService = referenceDataService ?? throw new ArgumentNullException(nameof(referenceDataService));
}
// In your action(s):
// var data = await _referenceDataService.GetReferenceDataAsync(HttpContext.RequestAborted);
}
Это быстрый и грязный код здесь. Что нужно учесть для улучшения:
Используйте интерфейс для вашего класса обслуживания, т. Е. IReferenceDataService
. Это облегчит тестирование. В ConfigureServices
:
services.AddHttpClient<IReferenceDataService, ReferenceDataService>(...);
Затем введите IReferenceDataService
.
Вы можете и должны использовать расширения Polly с AddHttpClient
для поддержки политик повторных попыток и обработки исключений. По крайней мере, вы определенно хотели бы добавить AddTransientHttpErrorPolicy
:
services.AddHttpClient<ReferenceDataService>(...)
.AddTransientHttpErrorPolicy(builder => builder.WaitAndRetryAsync(new[]
{
TimeSpan.FromSeconds(1),
TimeSpan.FromSeconds(5),
TimeSpan.FromSeconds(10)
}));
Это будет обрабатывать временные ошибки, такие как временная неспособность подключиться к API, потому что он был перезапущен или что-то в этом роде. Вы можете найти больше информации и более продвинутые возможности конфигурации в документах .
Вы должны использовать отдельные классы DTO. Для краткости я просто использовал ваш (предполагаемый) класс сущностей ReferenceData
. Вместо этого вы всегда должны использовать настраиваемые классы DTO, которые содержат только те части данных, которые вам нужны для доступа через API. Таким образом, вы можете управлять такими вещами, как сериализация, а также пользовательские схемы проверки, не вступая в конфликт с тем, что происходит с вашим классом сущностей. Кроме того, веб-проекту потребуется знать только о ReferenceDataDTO
(или любом другом), то есть вы можете совместно использовать библиотеку со своими DTO между API и веб-проектами и полностью исключить DAL из своего веб-проекта.