0

我正在尝试自定义标准 ODataMediaTypeFormatter 的行为,并通过将它们包装在另一种扩展 MediaTypeFormatter 的类型中来做到这一点。例如

var formatters = ODataMediaTypeFormatters
                   .Create(serialiserProvider, deserialiserProvider)
                   .Select(formatter => new Wrapper(formatter));

config.Formatters.InsertRange(0, formatters);

WebAPI 配置方法执行后,config.Formatters 包含 12 项(其中 7 项是包装的格式化程序)。

但是,当响应被序列化时,config.Formatters 包含 17 个项目,因为标准 OData 格式化程序已在某些时候重新添加。然后优先使用相关的标准格式化程序而不是包装版本。

有谁知道这种重新添加何时发生以及是否/如何防止它?

4

1 回答 1

0

当我意识到格式化程序没有重新添加到 GlobalConfiguration.Configuration.Formatters,而只是 ControllerContext.Configuration.Formatters 时,我明白了这一点。

ODataController 使用 ODataFormattingAttribute 进行注释。这将检查控制器的配置是否包含任何 ODataMediaTypeFormatters,如果没有,则重新添加它们。

当它执行此检查时,它还会使用Decorator.GetInner查找包装的格式化程序,因此让包装器实现IDecorator解决了问题。

于 2015-06-01T09:56:43.873 回答