Почему ядро ​​asp.net отправляет пустой объект в качестве ответа?

Когда я отлаживаю код в VS, список городов, который 9X_visual-c# я возвращаю, содержит 3 объекта вместе со 9X_c-sharp свойствами. Когда я вызываю эту конечную 9X_asp.net-5 точку, я получаю ответ из трех элементов 9X_angular списка пустых объектов.

Как решить эту проблему?

Класс модели:

public class City { public string CityName; public string AssociatedCities; public string Province; public int Status; public City(string cityName, string associatedCities, string province, int status) { this.CityName = cityName; this.AssociatedCities = associatedCities; this.Province = province; this.Status = status; } } 

Конечная точка:

[HttpGet] [Route("cities")] public ActionResult> GetCities() { return Ok(Cities); } 

Так 9X_asp.net-5 я вызываю конечную точку

getCities() { this.http.get('/api/wizard/cities') .subscribe(result => { console.log(result); this.cities = result; }, error => console.error('Something went wrong : ' + error)); } 

Я получаю ответ: 9X_Почему ядро ​​asp.net отправляет пустой объект в качестве ответа?_csharp

Необходимый 9X_c-sharp ответ:

[ { "SearchCity": "Toronto", "AssociatedCities": "Ajax, Whitby, Toronto, Mississauga, Brampton", "Province": "ON", "Status": 1 }, { "SearchCity": "Vancouver", "AssociatedCities": "Vancouver, Vancouver City", "Province": "BC", "Status": 1 } ] 

Я уже пробовал это: Fresh ASP.NET Core API returns empty JSON objects

17
3

  • Пожалуйста, добавьт ...
3
Общее количество ответов: 3

Ответ #1

Ответ на вопрос: Почему ядро ​​asp.net отправляет пустой объект в качестве ответа?

System.Text.Json в настоящее время не поддерживает сериализацию 9X_angular4.x / десериализацию полей и конструкторов без 9X_asp-net-core параметров и не по умолчанию.

В вашем примере 9X_angularjs2 модели используются как поля, так и конструктор не по умолчанию. Если по 9X_aspnet-core какой-то причине вам нужно использовать 9X_angular4.x настраиваемый конструктор, вам нужно будет 9X_asp.net-core реализовать свой собственный JsonConverter для поддержки 9X_c# этого. Этот документ может быть полезен 9X_aspnet-core для этого: https://docs.microsoft.com/en-us/dotnet/standard/serialization/system-text-json-migrate-from-newtonsoft-how-to#deserialize-to-immutable-classes-and-structs

Поддерживаются только общедоступные свойства с общедоступными 9X_asp.net-core геттерами / сеттерами, а также конструктор без параметров по умолчанию (так называемый 9X_c#.net Plain_old_CLR_object (POCO)). Примечание. Если вы только сериализуете 9X_c-sharp (т.е. пишете), сеттеры обычно не должны 9X_aspnet-core быть общедоступными.

Properties отличаются от полей 9X_angular4.x (и содержат геттеры / сеттеры).

Вот исправление:

public class City { public string CityName { get; set; } public string AssociatedCities { get; set; } public string Province { get; set; } public int Status { get; set; } } 

16
0

Ответ #2

Ответ на вопрос: Почему ядро ​​asp.net отправляет пустой объект в качестве ответа?

В моем случае я просто добавил это в свой 9X_asp.net-5 метод ConfigureServices в Startup.cs (я 9X_c#.net использую Dot Net 5.0)

services.AddControllers().AddNewtonsoftJson(); 

9
0

Ответ #3

Ответ на вопрос: Почему ядро ​​asp.net отправляет пустой объект в качестве ответа?

Исходя из того, что все ваше действие возвращает 9X_aspnet-core Cities, который предположительно является свойством 9X_csharp или полем, определенным на вашем контроллере, я 9X_csharp собираюсь сделать снимок в темноте и предположить, что 9X_asp.net-core-webapi вы устанавливаете это в другой запрос и 9X_aspnet-core ожидаем, что он все еще будет там в этом 9X_angular запросе. Это не так. Контроллер создается 9X_asp.net-5 и удаляется с каждым запросом, поэтому все, что 9X_angular4 ему задано в течение времени жизни запроса, не 9X_angularjs2 сохранится. В результате Cities ничего не содержит 9X_c-sharp в этом запросе, поэтому вы получите пустой 9X_angular ответ.

Если вам нужен список городов в действии, вы 9X_angularjs2 должны запросить их в этом действии. Кроме того, чего бы 9X_c# это ни стоило, System.Text.Json в настоящее 9X_angular2 время не поддерживает сериализацию полей, как 9X_asp.net-core-webapi другие упоминали в комментариях, но вместо 9X_angular этого вы все равно можете использовать JSON.NET, что 9X_angular2 делает. См .: https://docs.microsoft.com/en-us/aspnet/core/migration/22-to-30?view=aspnetcore-3.1&tabs=visual-studio#jsonnet-support

5
0