我想要这样的 API:
public class RelayController : ApiController
{
// POST api/values
public void Post([FromBody]IDataRelayPackage package)
{
MessageQueue queue = new MessageQueue(".\\private$\\DataRelay");
queue.Send(package);
queue.Close();
}
}
我得到的“包”值为空,所以我想知道可能出了什么问题。我唯一的想法是默认的 JSON
序列化器无法处理这个问题,但我不清楚如何修复它。
最佳答案
您可以使用自定义模型 Binder 轻松完成此操作。这对我有用。 (使用 Web API 2 和 JSON.Net 6)
public class JsonPolyModelBinder : IModelBinder
{
readonly JsonSerializerSettings settings = new JsonSerializerSettings { TypeNameHandling = TypeNameHandling.Auto };
public bool BindModel(HttpActionContext actionContext, ModelBindingContext bindingContext)
{
var content = actionContext.Request.Content;
string json = content.ReadAsStringAsync().Result;
var obj = JsonConvert.DeserializeObject(json, bindingContext.ModelType, settings);
bindingContext.Model = obj;
return true;
}
}
Web API Controller 如下所示。 (注意:也应该适用于常规 MVC 操作——我之前也为它们做过类似的事情。)
public class TestController : ApiController
{
// POST api/test
public void Post([ModelBinder(typeof(JsonPolyModelBinder))]ICommand command)
{
...
}
}
我还应该注意,当您序列化 JSON 时,您应该使用相同的设置对其进行序列化,并将其序列化为一个接口(interface),以使自动启动并包含类型提示。像这样。
JsonSerializerSettings settings = new JsonSerializerSettings { TypeNameHandling = TypeNameHandling.Auto };
string json = JsonConvert.SerializeObject(command, typeof(ICommand), settings);
关于c# - 我可以将基于接口(interface)的对象传递给 MVC 4 WebApi POST 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14124189/