Похоже, у меня есть проблемы с моим ASP. NET API, обращающимся к Angular, и я не совсем понимаю, почему. Я надеюсь, что кто-то сможет взглянуть на то, что я сделал, и найти что-нибудь очевидное.
В моем контроллере API есть следующий код:
// Data Structure to hold results from query
public class MyContainer
{
public ulong id;
public int num;
public MyContainer(ulong id, int num)
{
this.id = id;
this.num = num;
}
}
public class MyAPIController : ControllerBase {
[Route("/Testing")]
[AllowAnonymous]
[HttpGet]
public IEnumerable<MyContainer> GetMethod()
{
var x = from r in context.TableOne
group r by r.Id into g
select new MyContainer(g.Key, g.Count() );
var y = x.First();
logger.LogInformation(y.num.ToString()); // This outputs correctly!
return x.ToList();
}
}
А в Angular, У меня есть следующая услуга:
const httpOptions = {
headers: new HttpHeaders({ 'Content-Type': 'application/json' })
};
class MyContainer {
public id: number;
public num: number;
}
export class MyService {
...
getMethod(): Observable<MyContainer> {
let url = this.baseUrl + 'Testing';
let test = this.http.get(url, httpOptions);
// This outputs an array with the correct number of elements, but they are all blank...
// Such as [{…}, {…}, {…}], and when expanded, they are empty.
test.subscribe(x => console.log(x));
return test;
}
}
Обратите внимание, я добавил три комментария в свой код выше, чтобы выделить свои проблемы.
Я только что начал изучать ASP. NET, так что я полагаю, что упускаю что-то очевидное.
То, что я знаю, работает:
- Маршрутизация работает - Я могу без проблем использовать свой API GetMethod ().
- Мой запрос к базе данных LINQ - как упоминалось во втором комментарии, из моего регистратора в контроллере API я вижу, что моя функция API успешно запрашивает базу данных и возвращает ожидаемое значение. Он просто неправильно передается на Angular.
Что я пробовал:
- Добавление атрибута
[ApiController]
к мой контроллер API. - Это на самом деле дает мне странную ошибку 400: «Входные данные не содержат, не содержат никаких JSON токенов ...»?
- Вместо этого используется POST из GET.
- Изменение структур данных, используемых в возврате (т.е. попытка
List<MyContainer>
) - Использование raw SQL вместо LINQ.
- Изменение
MyContainer
использовать только строки + преобразование результатов запроса к базе данных в строки (чтобы увидеть, может ли это быть проблемой сериализации).
Что, по моему мнению, могут быть проблемы:
- ASP .NET / Angular мне не нравится, что я возвращаю данные через мой
MyContainer
класс. - Поскольку я использую платформу Entity Core, это может не понравиться этот
MyContainer
не зарегистрирован как «Тип объекта без ключа», но он не дает мне никаких ошибок, поэтому я не думаю, что это проблема. - Каждый раз, когда я go проверяю это Функция API, Бог посылает космические c лучи правильным образом, чтобы поразить электроны, сохраняя результат возврата API в Angular памяти, таким образом давая мне правильное количество пустых элементов.
Любая помощь очень ценится! У меня есть ощущение, что это связано с тем, что я использую настраиваемый тип данных, но опять же, я понятия не имею, почему это может быть проблемой, если его невозможно преобразовать в JSON ...
Изменить: использовать следующие библиотеки
using System;
using System.Data.SqlClient;
using System.Linq;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Data.Sqlite;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Logging;