OData WebAPI操作参数的反序列化

3

尝试使用OData WebAPI,并调用一个带有参数的操作,将其序列化为没有元信息的JSON。

因此,我想传递一个类型的对象:

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

public enum RequestReason
{
    New,
    Dublicate
}

我已创建了一个模型,并配置了一个操作:

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 Accept: application/json;odata=light

以及以下正文:

{"Info":{"Reason":1}}

但是,我得到了一个无法转换的"Newtonsoft.Json.Linq.JObject"类型的对象!如果我将对象类型更改为int,则一切都可以正常工作:)这是WebAPI OData的错误还是我的问题?


只是一个快速的提示:你的content-type和accept headers中的"odata=light"部分来自新JSON规范的预发布版本,现已被移除。相反,请使用"application/json"或"application/json;odata=minimalmetadata"。 - Jen S
相同的结果。我使用了来自Nuget的所有库的最新版本,System.Web.Http.OData v0.3.0.0。 - Sergey
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 >();


1
  1. 不,它们不会。我创建了一个没有参数的测试操作,它返回带有虚假数据的SomeRequest实例的JSON格式,并将其用作示例。它将枚举作为数字返回。
  2. 正如我在注释中写的那样,使用“application/json;odata=minimalmetadata”或“application/json”,我得到了相同的结果。
- Sergey

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接