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);