相信大家在项目中都用过统一响应参数模板。
先声明一个响应模板类:
public class ResponseDto{ public int code { get; set; } public stringFormatters.Add(new XmlDataContractSerializerOutputFormatter());// 我们自定义的输出格式c.OutputFormatters.Add(new ObjectOutputFormatter());});}搞定,我们来看看效果:

ActionFilterAttribute
有些同学可能会想到过滤器,是的,上面的效果过滤器也能实现:
public class ResultFilter : ActionFilterAttribute{ public override void OnResultExecuting(ResultExecutingContext context) { ResponseDto result = new ResponseDto(); result.code = 200; result.msg = "成功,ResultFilter"; var properties = context.Result.GetType().GetProperties(BindingFlags.Instance | BindingFlags.Public); result.data = properties.FirstOrDefault(c => c.Name == "Value").GetValue(context.Result); context.Result = new JsonResult(result); base.OnResultExecuting(context); }}[TypeFilter(typeof(ResultFilter))][HttpGet]public WeatherForecast Get(){return new WeatherForecast() { Date = DateTime.Now };}
猴:有了过滤器为什么还搞个OutputFormatter呢?
我:不能因为过滤器可以实现同样的功能就认为OutputFormatter多余了,很显然过滤器的操作对象是请求/响应上下文,而OutputFormatter的操作对象则是响应参数。再说了,ActionFilterAttribute过滤器只是众多过滤器的一种。
猴:那过滤器和自定义OutputFormatter一起用会是什么效果呢?是不是像下面这样?

我:不是,过滤器和自定义OutputFormatter同时使用,生效的只有过滤器,不信可以打断点试一下哦。
[Produces("text/object")][TypeFilter(typeof(ResultFilter))][HttpGet]public WeatherForecast Get(){return new WeatherForecast() { Date = DateTime.Now };}
到此这篇关于.NET Core API之格式化输出对象OutputFormatter的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持我们。








