2014-06-25 33 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,书);奇迹般有效。谢谢! –