我遇到了一个问题,我怀疑是由于JSON.Net的TypeNameHandling的不正确实现造成的。
我的Web API方法需要基类型BaseObj
的参数。期望客户端传入派生类型的对象(例如DerivedObj
)。为了使.NET将派生类型映射到基类型,全局JsonFormatter设置为在WebApiConfig.cs中使用TypeNameHandling.Auto
。这是我正在做的一个人为的例子。
// The base and derived types
public class BaseObj { public virtual string Text { get; set; } }
public class DerivedObj { public override string Text { get; set; } }
// The API controller
public class TestApiController : ApiController
{
public string TestMethod([FromBody]BaseObj obj) {
return ((DerivedObj)obj).Text; // ERROR: "Unable to cast object of type..."
}
}
// TypeNameHandling is configured in WebApiConfig.cs
public static class WebApiConfig {
public static void Register(HttpConfiguration config) {
config.Formatters.JsonFormatter.SerializerSettings.TypeNameHandling = Newtonsoft.Json.TypeNameHandling.Auto;
...
}
}
我的客户端使用JQuery使用派生类型调用API方法(请注意$type
字段)。
$.ajax({
url: "http://localhost/TestApi/TestMethod",
data: JSON.stringify({ $type: "MyAssembly.MyNamespace.DerivedObj, MyAssembly", Text: "hi!" }),
dataType: "json",
contentType: 'application/json',
method: "POST",
processData: false
})
.success(function (response) {
console.log(response); // response should be "hi!"...
})
.fail(function (response) {
console.error(response); // ...instead, TestMethod throws the cast exception
});
问题是,API方法收到的obj
参数确实属于BaseObj
类型,而不是DerivedObj
中指定的客户端$type
,因此&# 34;无法投射类型的物体......"行return ((DerivedObj)obj).Text;
我怀疑TypeNameHandling因以下两个原因而无效:
public string TestMethod([FromBody]DerivedObj obj)
$type
字段更改为伪类型,则不会收到任何错误,指出未找到伪类型。我希望这会发生,但我不知道JSON.Net / Web API如何处理这种情况。 (即使类型不好,它是否允许请求?)我确实通过在调试器中查看TypeNameHandling
来验证GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings.TypeNameHandling
设置是否已正确设置。
要启用TypeNameHandling还有更多工作要做吗?如果我不需要,我宁愿不实现自定义JsonConverter。