尝试使用 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还是我做错了什么?
最佳答案
您的使用有一些问题,
- 枚举映射到 aspnet Web API OData 中的字符串。因此,您的请求正文应该改为 { "Reason": 'Duplicate'。
- 正如 Jen 已经指出的那样,application/json;odata=light 不是受支持的媒体类型。您可能希望使用“application/json;odata=minimalmetadata”或仅使用“application/json”。
action.Returns< HttpResponseMessage > 没有用。这会将 HttpResponseMessage 映射为服务的 EDM 模型中的复杂类型。我不确定映射会是什么样子。通常,您希望在正在构建的 EDM 模型中公开模型中的类型。你应该从你的模型中选择一个更具体的类型,更像是,
action.Returns< IDCard >();
关于.net - OData Web API 操作参数反序列化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14880960/