Web Api - Как вернуть динамический объект с кодом состояния 201

Я пытаюсь вернуть недавно добавленный идентификатор сущности в методе действия Web Api в виде JSON. Пример:

{ bookId = 666 }

Код действия контроллера выглядит следующим образом:

[HttpPost, Route("")]
public HttpResponseMessage Add(dynamic inputs)
{
    int bookId = bookService.Add(userId, title);

    dynamic book = new ExpandoObject();
    book.bookId = bookId

    return new HttpResponseMessage(HttpStatusCode.Created)
    {
        Content = new ObjectContent<dynamic>(book,
            new JsonMediaTypeFormatter
            {
                UseDataContractJsonSerializer = true
            })
    };
}

Проблема здесь заключается в том, чтобы выполнить возврат динамического содержимого (без Dto) и вернуть HttpStatusCode.Created (состояние HTTP http 201).

Теперь у меня есть следующая ошибка:

{"Message": "Произошла ошибка.","ExceptionMessage":"Типу ObjectContent`1'не удалось сериализовать тело ответа для типа контента'application/json; charset=utf-8'.","ExceptionType":"System.InvalidOperationException","StackTrace":null,"InnerException":{"Message":" Произошла ошибка. "," ExceptionMessage ":" Нет особого типа "System.Dynamic.ExpandoObject' ..,

если я изменю new ObjectContent<dynamic> от new ObjectContent<ExpandoObject> Я получил правильный ответ заголовка статуса 201, но результат JSON выглядит следующим образом:

[{"Key":"bookId","Value":666}]

Итак, возможно ли вернуть { bookId: 666}, используя динамику (не Dtos), установив код состояния заголовка в 201 (Создан)?

Спасибо за помощь.

1 ответ

Решение

Вы видите правильное поведение, потому что dynamic / ExpandoObject эффективно просто обертка вокруг Dictionary<TKey, TValue>,

Если вы хотите, чтобы он был сериализован как объект, вы должны использовать анонимный объект вместо ExpandoObject например

int bookId = bookService.Add(userId, title);

var book = new { bookId = bookId };

return new HttpResponseMessage(HttpStatusCode.Created)
{
    Content = new ObjectContent<object>(book,
        new JsonMediaTypeFormatter
        {
            UseDataContractJsonSerializer = true
        })
};

Если JsonMediaTypeFormatter не поддерживает анонимные объекты, тогда вы можете попробовать использовать сериализатор по умолчанию

return this.Request.CreateResponse(HttpStatusCode.OK, book);
Другие вопросы по тегам