我有一个自定义的ContractResolver,它序列化选择性属性。在每个客户端请求中,我都会创建一个传递布尔值(取决于条件)的实例,并将其设置为JsonFormatter的ContractResolver。
GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings.ContractResolver = new DynamicContractResolver(false);
调试时,protected override IList<JsonProperty> CreateProperties(Type type, MemberSerialization memberSerialization)
方法永远不会被命中。
我不明白为什么JsonFormatter中没有设置新的ContractResolver。
此外,我设置新ContractResolver的方法看起来像:
[HttpGet]
public CustObj GetInfo(string param)
我真的不能做像return Request.CreateResponse(HttpStatusCode.OK, result, formatter);
这样的事情,因为我需要返回CustObj
。
注意:我正在Global.asax.cs
文件中设置JsonFormatter。
我意识到应用程序使用了自定义ContentNegotiator
,因此无法重置json格式化程序。ContentNegotiator
在Global.asax文件中设置如下。
GlobalConfiguration.Configuration.Services.Replace(typeof(IContentNegotiator), new JsonContentNegotiator(jsonFormatter));
因此,对于控制器中的每个请求,我调用这个方法,它基本上取代了现有的ContentNegotiator
。
private void SetNewJsonFormatterWithCustomContractResolver(bool returnMVFormat)
{
//Create a new JsonMediaTypeFormatter
var newJsonFormatter = new JsonMediaTypeFormatter();
newJsonFormatter.SerializerSettings = new JsonSerializerSettings()
{
ContractResolver = new DynamicContractResolver(returnMVFormat)
};
GlobalConfiguration.Configuration.Services.Replace(typeof(IContentNegotiator), new JsonContentNegotiator(newJsonFormatter));
}