我试图将Web Api操作方法中最近添加的实体ID作为JSON返回。例如:
{ bookId = 666 }
Controller Action代码如下:
[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状态)。
现在我有下一个错误:
{&#34;消息&#34;:&#34;发生错误。&#34;,&#34; ExceptionMessage&#34;:&#34;&#39; ObjectContent`1&#39 ;类型无法序列化内容类型的响应主体&#39; application / json;字符集= UTF-8&#39;&#34;&#34; ExceptionType&#34;:&#34; System.InvalidOperationException&#34;&#34;堆栈跟踪&#34;:空,&#34;的InnerException& #34;:{&#34;消息&#34;:&#34;发生错误。&#34;,&#34; ExceptionMessage&#34;:&#34; No se espera el tipo&#39; System.Dynamic.ExpandoObject&#39; ...
如果我将new ObjectContent<dynamic>
更改为new ObjectContent<ExpandoObject>
,我会收到正确的201状态标头响应,但JSON结果如下:
[{"Key":"bookId","Value":666}]
那么,是否可以使用动态(而不是Dtos)将标题状态代码设置为201(已创建)返回{bookId:666}?
感谢您的帮助。
答案 0 :(得分:4)
您看到的行为是正确的,因为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);