Asp.net mvc 4 自定义MediaTypeFormatter,为什么是IKeyValueModel而不是我的模型类型?

Asp.net mvc 4 自定义MediaTypeFormatter,为什么是IKeyValueModel而不是我的模型类型?,asp.net-mvc-4,asp.net-web-api,mediatypeformatter,Asp.net Mvc 4,Asp.net Web Api,Mediatypeformatter,我正在尝试自定义实现一个MediaTypeFormatter,但是方法bool CanReadType(Type Type)总是使用类型IKeyValueModel来调用,而不是我的类型MyProduct 在我的API控制器中,我有: [HttpPost] public Task Save(MyProduct product) 我已经看到了一些示例(,),我还尝试了以下代码: protected override bool CanReadType(Type type) { if (ty

我正在尝试自定义实现一个
MediaTypeFormatter
,但是方法
bool CanReadType(Type Type)
总是使用类型
IKeyValueModel
来调用,而不是我的类型
MyProduct

在我的API控制器中,我有:

[HttpPost]
public Task Save(MyProduct product)
我已经看到了一些示例(,),我还尝试了以下代码:

protected override bool CanReadType(Type type)
{
    if (type == typeof(IKeyValueModel))
        return false;
      return true;
}
但是我得到了一个“MissingMethodException:没有为此对象定义无参数构造函数”,因为我的模型类型没有无参数构造函数。因此,看起来是因为
CanReadType
将false返回给
IKeyValueModel
,所以框架使用了另一个媒体类型格式化程序。实际上,方法
OnReadFromStreamAsync
从未被命中

我希望能够控制模型的反序列化方式,我希望得到真实的类型,而不是
IKeyValueModel

这在MVC中使用模型绑定已经非常有效了

干杯

2012/05/29更新:

如果删除默认的json格式化程序,它将正常工作:

    public static void RegisterApis(HttpConfiguration config)
    {
        config.Formatters.Clear();
但是我想保留这两个,我怎么能指出我想使用哪一个呢


关于。

如果您需要控制序列化,最好使用Json.NET的灵活性功能(请参阅和)来控制,而不是为此编写媒体类型格式化程序

Json.NET是ASP.NET Web API中的默认格式化程序


更新
我的对象没有无参数构造函数和属性 是只读的。我还有从DynamicObject继承的对象,所以 假设我的业务实体不是微不足道的

我也许可以教你怎么射自己的脚。但我更愿意解释如何避免出现这些问题,因为我相信您正在遇到这些问题,因为您的方法中存在反模式

首先,您需要的不是另一种媒体类型的格式化程序。您需要不同的序列化程序,或者只需要配置序列化程序

但更重要的是,将业务实体直接序列化到客户机并不是一个好主意。我们需要DTO,这里称为视图模型。这些类只是状态持有者,没有逻辑,没有魔力。序列化它们应该没有问题


您可以使用AutoMapper等将实体映射到视图模型,而无需更多的开发成本通常建议您将域模型从表示层中抽象出来。

为什么需要自定义
MediaTypeFormatter
?请尝试最新代码(夜间构建),当前源代码中没有IKeyValueModel。团队已将其删除/删除@Aliostad我需要一个自定义的MediaTypeFormatter来控制我的对象如何被序列化和反序列化为JSON。@user960567,这样我们就可以期望在发布中有很大的变化?@NullOrEmpty,henrik一直在帮助我们,我的对象没有无参数构造函数,属性是只读的。我还有从DynamicObject继承的对象,所以假设我的业务实体不是微不足道的。我实际上是在幕后使用JSON.NET,但我需要以一种自定义的方式使用它。谢谢您的输入,但问题是关于其他方面的。当我们创建JSON实体时,实际上是在创建DTO,这就是JSON的要点:)因此,我需要一种方法来控制这些JSON DTO在我的业务实体中的转换方式。。。正如我已经说过的,我的业务对象是dynamics(System.Dynamic),这不是要序列化一个对象及其所有属性,而是要从我的动态业务对象和viceversa创建一个JSON传输对象。