2014-06-25 34 views
2

我試圖以Web JSON的形式返回Web Api操作方法中最近添加的實體Id。例如: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}] 

那麼,是否可以使用動態(不是Dtos)將標題狀態代碼設置爲201(創建)來返回{bookId:666}?

謝謝您的幫助。

回答

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不支持匿名對象,那麼你可以嘗試使用默認的序列

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

this.Request.CreateResponse(HttpStatusCode.OK,書);奇蹟般有效。謝謝! –