发布派生类型时,TypeNameHandling在.NET Web API中不起作用

时间:2015-10-22 21:28:37

标签: .net asp.net-web-api json.net asp.net-web-api2

我遇到了一个问题,我怀疑是由于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因以下两个原因而无效:

  • 如果我将API方法更改为期望派生类型而不是基本类型,则此示例正常工作:public string TestMethod([FromBody]DerivedObj obj)
  • 如果我将此示例中的$type字段更改为伪类型,则不会收到任何错误,指出未找到伪类型。我希望这会发生,但我不知道JSON.Net / Web API如何处理这种情况。 (即使类型不好,它是否允许请求?)

我确实通过在调试器中查看TypeNameHandling来验证GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings.TypeNameHandling设置是否已正确设置。

要启用TypeNameHandling还有更多工作要做吗?如果我不需要,我宁愿不实现自定义JsonConverter。

0 个答案:

没有答案