2014-06-25 4 views
2

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

{ 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 (201 статуса HTTP) ,

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

{"Message":"An error has occurred.","ExceptionMessage":"The 'ObjectContent`1' type failed to serialize the response body for content type 'application/json; charset=utf-8'.","ExceptionType":"System.InvalidOperationException","StackTrace":null,"InnerException":{"Message":"An error has occurred.","ExceptionMessage":"No se espera el tipo 'System.Dynamic.ExpandoObject' ...

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

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

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

Благодарим за помощь.

ответ

3

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

Если вы хотите, чтобы он был сериализован как объект, вы должны использовать anonymous object вместо 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 не поддерживает анонимные объекты, то вы можете попробовать использовать Serializer Значение по умолчанию

return this.Request.CreateResponse(HttpStatusCode.OK, book); 
+0

this.Request.CreateResponse (HttpStatusCode.OK, книги); работает как шарм. Спасибо! –