我正在编写一个 Web API,客户端可以请求以 XML 格式返回数据。我正在使用 Enterprise Foundation 和 MVC4 在 .NET 中实现这一点。
我正在努力解决如何从我的控制器中的模型中只返回某些字段的子集。
为了论证,假设我有一个 Product 模型,其中包含属性“Id”、“Name”、“Price”和“Actual Cost”(我使用的示例来自http://www.asp.net/web-api /overview/creating-web-apis/using-web-api-with-entity-framework/using-web-api-with-entity-framework,-part-6 )
我需要为客户公开一个 Web API 以查询特定产品以获取其名称和价格,但在此响应中我不想返回“实际成本”属性(因为这是我们的秘密)。
现在在我提供的链接中,这正是他们试图通过使用 DTO 来解决的问题(他们定义了一个名为 ProductDTO 的 DTO,它只包含我想要返回的子集)。我已经实现了这个解决方案,我现在确实能够只返回我在 DTO 中指定的字段。
问题是用于在 XML 中返回的实体的命名现在是 ProductDTO 而不是 Product,即返回的 XML 是
{"ProductDTO":[{"Id":1,"Name":"Tomato Soup","Price":1.39}, {"Id":3,"Name":"Yo yo","Price":6.99]}
而不是
{"Product":[{"Id":1,"Name":"Tomato Soup","Price":1.39}, {"Id":3,"Name":"Yo yo","Price":6.99]}
这意味着我们所有当前使用我们的 API 并期望返回“产品”的客户现在将返回“产品 DTO”,这意味着他们将不得不更改他们的代码,这是不可接受的。我需要为他们提供一个“产品”,其中只有他们目前获得的相关子字段集。我如何实现这一目标?我不能像阻止属性在 web api 中序列化中所建议的那样简单地“忽略”数据成员,因为我也有一些 API 案例,我确实需要返回所有属性而不仅仅是一个子集。
只是一些背景知识:我们有一个现有的 API 服务器接口,它是用 Ruby on Rails 编写的,我们现在正在将它转移到 C# 和 .NET MVC4。我们还有一堆客户端应用程序已经连接到我们现有的、较旧的 Ruby on Rails API 服务器,我们不希望客户端对其代码进行任何更改。我们只是将 API 服务器代码从 Ruby on Rails 转移到 C#。在 Ruby on Rails 中,当我只需要在某些调用上返回属性的子集时,我可以简单地将过滤器应用于 XML 序列化器。