ASP.NET Web API 2如何为不同控制器配置不同WebApiConfig?
针对不同控制器设置不同JSON序列化规则的解决方案
刚好碰到过类似的场景,你需要给Android专属控制器单独配置不忽略NULL值,同时保留全局的NULL忽略设置给AngularJS前端,这里有两个实用的方案:
方案一:使用Action Filter(推荐,灵活可控)
你可以自定义一个Action Filter,在需要返回完整属性的控制器或Action上标记这个属性,实现局部覆盖全局的序列化设置。
步骤1:创建自定义Action Filter
using System.Web.Http.Filters; using Newtonsoft.Json; using System.Net.Http.Formatting; public class AllowNullValuesAttribute : ActionFilterAttribute { public override void OnActionExecuted(HttpActionExecutedContext actionExecutedContext) { base.OnActionExecuted(actionExecutedContext); // 获取当前响应的JSON格式化器 var jsonFormatter = actionExecutedContext.Response?.Content?.GetType() .GetProperty("Formatter")?.GetValue(actionExecutedContext.Response.Content) as JsonMediaTypeFormatter; if (jsonFormatter != null) { // 克隆全局的序列化设置,避免修改全局配置 var customSettings = new JsonSerializerSettings(jsonFormatter.SerializerSettings); customSettings.NullValueHandling = NullValueHandling.Include; jsonFormatter.SerializerSettings = customSettings; } } }
步骤2:在Android专属控制器上应用该属性
// 给整个控制器标记,所有Action都会返回包含NULL值的JSON [AllowNullValues] public class AndroidProductController : ApiController { // 示例Action public IHttpActionResult GetProduct(int id) { var product = // 你的实体查询逻辑 return Ok(product); } }
如果只是某个Action需要特殊处理,直接把[AllowNullValues]标记在对应的Action方法上即可,非常灵活。
方案二:控制器级别重写格式化器配置
如果你的Android专属控制器所有Action都需要返回完整属性,可以在控制器初始化时替换JSON格式化器的设置,确保只对当前控制器生效。
实现代码
using System.Web.Http; using System.Net.Http.Formatting; using Newtonsoft.Json; public class AndroidProductController : ApiController { protected override void Initialize(HttpControllerContext controllerContext) { base.Initialize(controllerContext); // 克隆全局的JSON格式化器,避免修改全局配置 var customJsonFormatter = controllerContext.Configuration.Formatters.JsonFormatter.Clone() as JsonMediaTypeFormatter; if (customJsonFormatter != null) { // 修改当前控制器的序列化设置 customJsonFormatter.SerializerSettings.NullValueHandling = NullValueHandling.Include; // 移除原有的JSON格式化器,添加自定义的版本 controllerContext.Configuration.Formatters.Remove(controllerContext.Configuration.Formatters.JsonFormatter); controllerContext.Configuration.Formatters.Add(customJsonFormatter); } } // 你的Action方法... }
关键说明
这里一定要用Clone()方法复制格式化器实例,而不是直接修改全局的JsonFormatter,否则会影响其他控制器的序列化行为——这正是你要避免的问题。
方案对比
- Action Filter:适合灵活控制,既可以给整个控制器生效,也可以针对单个Action,代码侵入性低。
- 控制器初始化重写:适合整个控制器都需要统一规则的场景,一次性配置完成。
两种方案都能完美解决你的需求,根据实际场景选就行~
内容的提问来源于stack exchange,提问作者Awais Mahmood
相关产品推荐
相关产品推荐

