Web Api - 如何使用201状态代码返回动态对象

时间:2014-06-25 10:10:53

标签: dynamic asp.net-web-api2 expandoobject

我试图将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}?

感谢您的帮助。

1 个答案:

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