3

尝试使用 OData webAPI 并使用参数调用操作,将其序列化为没有元信息的 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 请求

内容类型:application/json;json=light; charset=utf-8 接受:application/json;odata=light

与身体

{“信息”:{“原因”:1}}

但是我得到了“Newtonsoft.Json.Linq.JObject”类型的对象,并且确定它不能被投射!但是,如果我将对象类型更改为 int,一切正常 :) 是 WebAPI OData 的错误还是我做错了什么?

4

1 回答 1

0

你的用法有几个问题,

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

    action.Returns<IDCard>();

于 2013-02-15T17:59:05.877 回答