Почему ядро ​​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