HttpClient System.Threading.Tasks.TaskCanceledException: «Операция отменена»

Итак, я уже несколько дней наблюдаю и изучаю ядро ​​.net. Я создал функционирующий API (с swaggerм) Есть контроллер, который я использую на данный момент, который соответствует моей проблеме (сомневаюсь, что с ним проблема, но для полноты):

    using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using BrambiShop.API.Data;
using BrambiShop.API.Models;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;

namespace BrambiShop.API.Controllers
{
    [Route("api/[controller]")]
    [ApiController]
    public class CategoriesController : ControllerBase
    {
        private BrambiContext _context;

        public CategoriesController(BrambiContext context)
        {
            _context = context;
        }

        // GET: api/ItemVariants
        [HttpGet]
        public async Task<IEnumerable<Category>> GetAsync()
        {
            return await _context.Categories.ToListAsync();
        }

        // GET: api/ItemVariants/5
        [HttpGet("{id}")]
        public async Task<Category> GetAsync(int id)
        {
            return await _context.Categories.FindAsync(id);
        }

        // POST-add: api/ItemVariants
        [HttpPost]
        public async Task<IActionResult> PostAsync([FromBody] Category item)
        {
            if (!ModelState.IsValid)
            {
                return BadRequest(ModelState);
            }
            _context.Categories.Add(item);
            await _context.SaveChangesAsync();
            return Ok();
        }

        // PUT-update: api/ItemVariants/5
        [HttpPut("{id}")]
        public async Task<IActionResult> PutAsync(int id, [FromBody] Category item)
        {
            if (!_context.Categories.Any(x => x.Id == id))
                return NotFound();

            if (!ModelState.IsValid)
            {
                return BadRequest(ModelState);
            }
            _context.Categories.Update(item);
            await _context.SaveChangesAsync();
            return Ok();
        }

        // DELETE: api/ItemVariants/5
        [HttpDelete("{id}")]
        public async Task<IActionResult> DeleteAsync(int id)
        {
            var itemToDelete = _context.Categories.Find(id);
            if (itemToDelete != null)
            {
                _context.Categories.Remove(itemToDelete);
                await _context.SaveChangesAsync();
                return Ok();
            }
            return NoContent();
        }
    }
}

Итак, где моя проблема. Моя проблема заключается в этом методе:

    public async void OnGet()
    {
        Categories = await _Client.GetCategoriesAsync();
    }

Который лежит в моем index.cshtml.cs.

Сам GetCategoriesAsync:

using BrambiShop.API.Models;
using System.Collections.Generic;
using System.Net.Http;
using System.Threading.Tasks;

namespace BrambiShop.UI.Services
{
    public interface IApiClient
    {
        Task<List<BrambiShop.API.Models.Category>> GetCategoriesAsync();
    }

    public class ApiClient : IApiClient
    {
        private readonly HttpClient _HttpClient;

        public ApiClient(HttpClient httpClient)
        {
            _HttpClient = httpClient;
        }

        public async Task<List<Category>> GetCategoriesAsync()
        {
            var response = await _HttpClient.GetAsync("/api/Categories");
            return await response.Content.ReadAsJsonAsync<List<Category>>();
        }
    }
}

Вот где я получаю исключение TaskCanceled. Я понятия не имею, что здесь не так. Это не имеет для меня никакого смысла. Startup.cs, определяющий HttpClient

            services.AddScoped(_ =>
            new HttpClient
            {
                BaseAddress = new Uri(Configuration["serviceUrl"]),
                Timeout = TimeSpan.FromHours(1)
            });
            services.AddScoped<IApiClient, ApiClient>();

А это метод ReadAsJsonAsync

using Newtonsoft.Json;
using System.IO;
using System.Net.Http;
using System.Threading.Tasks;

namespace BrambiShop.UI
{
    public static class HttpClientExtensions
    {
        private static readonly JsonSerializer _jsonSerializer = new JsonSerializer();

        public static async Task<T> ReadAsJsonAsync<T>(this HttpContent httpContent)
        {
            using (var stream = await httpContent.ReadAsStreamAsync())
            {
                var jsonReader = new JsonTextReader(new StreamReader(stream));

                return _jsonSerializer.Deserialize<T>(jsonReader);
            }
        }

        public static Task<HttpResponseMessage> PostJsonAsync<T>(this HttpClient client, string url, T value)
        {
            return SendJsonAsync<T>(client, HttpMethod.Post, url, value);
        }

        public static Task<HttpResponseMessage> PutJsonAsync<T>(this HttpClient client, string url, T value)
        {
            return SendJsonAsync<T>(client, HttpMethod.Put, url, value);
        }

        public static Task<HttpResponseMessage> SendJsonAsync<T>(this HttpClient client, HttpMethod method, string url, T value)
        {
            var stream = new MemoryStream();
            var jsonWriter = new JsonTextWriter(new StreamWriter(stream));

            _jsonSerializer.Serialize(jsonWriter, value);

            jsonWriter.Flush();

            stream.Position = 0;

            var request = new HttpRequestMessage(method, url)
            {
                Content = new StreamContent(stream)
            };

            request.Content.Headers.TryAddWithoutValidation("Content-Type", "application/json");

            return client.SendAsync(request);
        }
    }
}

Все просто приходит к этой ошибке: HttpClient System.Threading.Tasks.TaskCanceledException: «Операция отменена»

Кто-нибудь на самом деле знает, что не так, и, возможно, может направить меня в правильном направлении? Я надеюсь на это, я не мог решить это в течение последних 4 часов.

Искренне спасибо.

__

Я также должен упомянуть, что иногда он загружается, и когда я делаю что-то вроде

Debug.WriteLine(Categories.Count);

Это дает мне правильный счет, поэтому данные загружаются

(также с записью имен с помощью foreach)

Изменить void на Task: public async Task OnGet()

user4864425 13.02.2019 20:36

@RuardvanElburg Боже мой. Это было так, Иисус. Последние 5 часов почти недействительны - Задание, спасибо. Не могли бы вы опубликовать это как ответ, чтобы я мог пометить его как решенный? Я не мог ничего найти об этом, и это действительно может помочь кому-то. Большое спасибо.

Tomáš Filip 13.02.2019 20:40
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
3
2
7 501
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Изменить пустоту на задачу:

 public async Task OnGet() 

Другие вопросы по теме