2

我正在编写一个 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 序列化器。

4

2 回答 2

0

假设你有一个像

public class product
{
public string Name{get; set;}
..
}

并且您不想在响应中出现它,您可以使用[XMLIgnore]属性

[XMLIgnore]
public string Name{get; set;}

希望这会有所帮助。

于 2013-09-20T10:09:33.593 回答
0

如果你想继续你已经开始的 DTO 路线,恕我直言,这是一个好主意,因为它可以让你控制你导出的内容,而不会用导出特定的东西污染你的内部类,你可以向你的 ProductDTO 类添加一个 DataContract 属性。

[DataContract(Name="Product")]
public class ProductDTO
{
    [DataMember]
    public int Id {get;set;}
    [DataMember]
    public string Name {get;set;}
}

Web API 中使用的默认 XML 格式化程序是 DataContractSerializer。您可以在此处阅读有关此内容的更多信息

于 2013-09-20T10:16:25.017 回答