Итак, я уже несколько дней наблюдаю и изучаю ядро .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);
}
}
}
Все просто приходит к этой ошибке:

Кто-нибудь на самом деле знает, что не так, и, возможно, может направить меня в правильном направлении? Я надеюсь на это, я не мог решить это в течение последних 4 часов.
Искренне спасибо.
__
Я также должен упомянуть, что иногда он загружается, и когда я делаю что-то вроде
Debug.WriteLine(Categories.Count);
Это дает мне правильный счет, поэтому данные загружаются
(также с записью имен с помощью foreach)
@RuardvanElburg Боже мой. Это было так, Иисус. Последние 5 часов почти недействительны - Задание, спасибо. Не могли бы вы опубликовать это как ответ, чтобы я мог пометить его как решенный? Я не мог ничего найти об этом, и это действительно может помочь кому-то. Большое спасибо.





Изменить пустоту на задачу:
public async Task OnGet()
Изменить void на Task: public async Task OnGet()