Веб-интерфейс AspNetCore ODataController не может десериализовать полезную нагрузку JSON - PullRequest
0 голосов
/ 20 сентября 2018

У меня проблемы с получением моего Vata ODataController для десериализации полезной нагрузки JSON.Я создал пример проекта в github, чтобы проиллюстрировать мою конкретную проблему:

https://github.com/valainisgt/BadODataDeserialization

Когда данные отправляются в конечную точку '/ odata / models' с использованием типа контента приложения /JSON, модель не заполнена.Используя те же самые ключи данных и значения, но на этот раз в качестве application / x-www-form-urlencoded, модель заполняется.

Что мне здесь не хватает?

Редактировать:

Вот как выглядит моя полезная нагрузка:

{ 'ModelId': 0, 'Name': "John Doe" }

Это основное приложение asp.net, предназначенное для .NET 462.

Поэтому я использую Microsoft.AspNetCore. *пакеты.

Ответы [ 2 ]

0 голосов
/ 20 сентября 2018

Когда данные, отправленные в конечную точку '/ odata / models' с использованием типа содержимого application / json, модель не заполняется.Используя те же самые ключи данных и значения, но на этот раз как application / x-www-form-urlencoded, модель заполняется.

  1. Если вы хотите получить контенттип application/json, вам нужно украсить вашу модель с [FromBody]

    public IActionResult Post([FromBody]Model m)
    

Тестовый набор:

POST http://localhost:50317/odata/models HTTP/1.1
Content-Type: application/json

{
    ModelId:11,
    Name:"hello"
}

Если вы хотите получить тип контента x-www-form-urlencoded, вам необходимо добавить [Bind()]:

public IActionResult Post([Bind("ModelId,Name")]Model m)

Тестовый пример:

POST http://localhost:50317/odata/models HTTP/1.1
Content-Type: application/x-www-form-urlencoded

ModelId=11&Name=hello

Однако нет встроенного связывателя моделей, который связывал бы оба типа данных.Если вы хотите сделать это, рассмотрите следующий подход:

  1. напишите два метода действия и маршрут в соответствии с различными заголовками
  2. custom связыватель модели

Для получения дополнительной информации см. Документы здесь

0 голосов
/ 20 сентября 2018

FromBodyAttribute в подписи метода действия, если вы выполняете HttpPost для своей конечной точки.

Например,

public async Task<IActionResult> MyMethod([FromBody] MyPayload payload)

{.... ваш код }

...