【问题标题】:Web API custom IContractResolverWeb API 自定义 IContractResolver
【发布时间】:2013-04-09 12:50:24
【问题描述】:

我实现了一个自定义 IContractResolver,以便我可以从我的 Web API 中动态过滤出对象的某些属性。例如,GetEmployees 操作将过滤掉返回的每个员工的“Id”属性。

public IEnumerable<Employee> GetEmployees()
{
    var ignoreList = new List<string> {"Id"};
    GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings.ContractResolver = new JsonContractResolver(ignoreList);
    return db.Employees.AsEnumerable();
}

问题是在同样的方法中,我想将合约解析器设置回它的默认值。像这样的:

public IEnumerable<Employee> GetEmployees()
{
    var defaultContractResolver = GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings.ContractResolver;
    var ignoreList = new List<string> {"Id"};
    GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings.ContractResolver = new JsonContractResolver(ignoreList);
    // Serialize object
    GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings.ContractResolver = defaultContractResolver;
    // return serialized object
}

实现这一目标的最佳方法是什么?

【问题讨论】:

    标签: c# json.net asp.net-web-api


    【解决方案1】:

    这绝对不是你尝试的方式。这样你会遇到线程问题。

    一种方法可能是将返回的对象更改为不包含Id-property。而是制作一个更专业的对象。这就是我要走的路。

    或者,您可以直接返回 HttpResponseMessage 并将内容设置为您喜欢的任何内容。但是你必须自己处理序列化和内容否定。

    【讨论】:

    • 那么,只需遍历从数据库请求的员工并创建要返回的专用对象的新列表吗?
    • 是的。对于特殊情况特殊数据对象。就我个人而言,无论如何我都不喜欢直接返回数据库对象(无论它们是否是 POCO),我将这些对象与 DTO 对象分开。
    猜你喜欢
    • 1970-01-01
    • 2017-08-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-08
    • 2012-11-28
    • 1970-01-01
    • 2020-03-14
    相关资源
    最近更新 更多