WebAPI控制器配置问题:仅为指定控制器应用自定义设置
解决WebAPI仅为特定控制器配置自定义Json序列化的问题
我最近在开发一个基于WebAPI的应用,需求很明确——只给ScheduleController设置自定义的Json序列化配置,其他控制器比如SimpleController保持默认就行。
一开始我想当然地实现了IControllerConfiguration接口,在Initialize方法里直接修改了现有Json格式化器的TypeNameHandling:
public class ScheduleControllerConfig : IControllerConfiguration { public void Initialize(HttpControllerSettings controllerSettings, HttpControllerDescriptor controllerDescriptor) { // 错误写法:修改了全局共享的格式化器实例 var jsonFormatter = controllerSettings.Formatters.JsonFormatter; jsonFormatter.SerializerSettings.TypeNameHandling = TypeNameHandling.Auto; } }
结果坑来了——所有控制器的Json序列化都用上了这个TypeNameHandling配置,完全不符合我只改单个控制器的需求!
后来才搞明白:WebAPI默认的格式化器是全局共享的实例,直接修改它的设置会作用于所有使用该格式化器的控制器,根本做不到“仅针对单个控制器”。
正确的解决方案
要实现仅对特定控制器生效的配置,核心是为目标控制器创建独立的格式化器实例,而不是修改全局共享的那个。具体步骤如下:
- 在
Initialize方法中,先清空当前控制器配置里的所有格式化器,避免复用全局实例; - 新建一个
JsonMediaTypeFormatter实例,配置好你需要的序列化设置; - 将这个新的格式化器添加到控制器的配置中。
代码示例:
public class ScheduleControllerConfig : IControllerConfiguration { public void Initialize(HttpControllerSettings controllerSettings, HttpControllerDescriptor controllerDescriptor) { // 清除原有格式化器,切断与全局实例的关联 controllerSettings.Formatters.Clear(); // 创建专属的Json格式化器并配置 var customJsonFormatter = new JsonMediaTypeFormatter(); customJsonFormatter.SerializerSettings.TypeNameHandling = TypeNameHandling.Auto; // 这里还可以添加其他自定义配置,比如日期格式、忽略空值等 // 将自定义格式化器添加到当前控制器的配置中 controllerSettings.Formatters.Add(customJsonFormatter); } }
最后别忘了在ScheduleController上标记使用这个配置:
[ControllerConfiguration(typeof(ScheduleControllerConfig))] public class ScheduleController : ApiController { // 控制器逻辑... }
这样操作后,ScheduleController就会使用我们自定义的Json序列化配置,而其他控制器依然保持默认的全局设置,完美解决了之前的问题!
内容的提问来源于stack exchange,提问作者user9137963
相关产品推荐
相关产品推荐

