.net - OData Web API 操作参数反序列化

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

尝试使用 OData webAPI 并调用带有参数的操作,在没有元信息的情况下序列化为 json。 所以,我想传递一个类型的对象:

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

public enum RequestReason
{
    New,
    Dublicate
}

我创建了一个 mdel,配置了一个 Action :

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

在 Controller 中有代码:

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

并期望对真实类型 SomeRequest 有值(value),转换类型并处理它...... 然后我用 header 发出 POST 请求

Content-Type: application/json;json=light; charset=utf-8 Accept: application/json;odata=light

和 body

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

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

最佳答案

您的使用有一些问题,

  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 >();

关于.net - OData Web API 操作参数反序列化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14880960/

相关文章:

.net - 在一个安装程序 exe 中一起安装 .NET Framework 和 VB.NET Apps

java - Sun SAAJ SOAP 实现的替代方案

c# - ASP.NET Web API 在 IIS 中发布时不起作用?

c# - 如何创建 IEnumerable.ToString

c# - 使用全局热键 : Get key that was actually pressed

c# - 支持 HTTP 和 HTTPS Web.Config WCF 服务

entity-framework - 使用 ASP.NET Web API 和 Entity Framework 进行 API 版本控制

javascript - 使用 SignalR、WebApi 和服务

c# - 如何在 .NET 中以编程方式为图像的透明部分着色

java - Java 对象如何在 SOAP Web 服务中传递