OData Web API操作参数反序列化

时间:2013-02-14 17:48:42

标签: .net web-services asp.net-web-api odata

尝试使用OData webAPI并使用param调用操作,序列化为json而不包含元信息。 所以,我想传递一个类型的对象:

public class SomeRequest
{
    public RequestReason Reason { get; set; }
}

public enum RequestReason
{
    New,
    Dublicate
}

我已经创建了一个mdel,配置了一个动作:

var action = modelBuilder.Entity<Member>().Action("SomeRequest");
action.Parameter<SomeRequest>("Info");
action.Returns<HttpResponseMessage>();
var model = modelBuilder.GetEdmModel();
configuration.EnableOData(model);

在控制器中有代码:

[HttpPost]
public HttpResponseMessage RequestIDCard(int key, [FromBody]ODataActionParameters param)
{
    object value;
    param.TryGetValue("Info", out value);
///!!!!
}

并期望具有真实类型SomeRequest的价值,转换类型并处理它... 然后我用标题

发出POST请求
  

Content-Type:application / json; json = light; charset = utf-8接受:   应用/ JSON;的OData =光

和身体

  

{ “信息”:{ “理”:1}}

但是我得到了类型为“Newtonsoft.Json.Linq.JObject”的对象并且确定无法进行渲染! 但如果我将对象类型更改为int,一切正常:) 这是WebAPI OData的错误还是我做错了什么?

1 个答案:

答案 0 :(得分:0)

您的使用情况有些不对,

  1. 枚举在aspnet Web API OData中映射到字符串。因此,您的请求正文应该{{Reason':'Duplicate'而不是。
  2. 正如Jen已经指出的那样,application / json; odata = light不是支持的媒体类型。您可能想要使用'application / json; odata = minimalmetadata'或只是'application / json'。
  3. action.Returns&LT; HttpResponseMessage&gt;没用。这会将HttpResponseMessage映射为服务的EDM模型中的复杂类型。我不确定映射会是什么样子。通常,您希望在正在构建的EDM模型中公开模型中的类型。您应该从模型中选择更具体的类型,更像是

    action.Returns&LT; IDCard&gt;();