【问题标题】:OData WebAPI Action's parameters deserialzationOData Web API 操作参数反序列化
【发布时间】:2013-01-30 14:48:24
【问题描述】:

尝试使用 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 接受: 应用程序/json;odata=light

和身体

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

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

【问题讨论】:

  • 请注意:您的内容类型和接受标头的“odata=light”部分来自新 JSON 规范的预发布版本,此后已被删除。相反,只使用“application/json”或“application/json;odata=minimalmetadata”
  • 同样的结果。我使用来自 Nuget 的所有库的最新版本,System.Web.Http.OData v0.3.0.0

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


【解决方案1】:

你的用法有几个问题,

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

    action.Returns();

【讨论】:

  • 1.不,他们没有。我创建了一个不带参数的测试操作,它以 json 格式返回 SomeRequest 的实例(带有假数据),并将其用作示例。它以数字形式返回枚举。 2. 正如我在 cmets 中所写,使用 'application/json;odata=minimalmetadata' 或 'application/json' 我有相同的结果
猜你喜欢
  • 1970-01-01
  • 2012-10-21
  • 2014-09-14
  • 1970-01-01
  • 2013-06-25
  • 1970-01-01
  • 2018-11-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多