4

我正在使用 ASP.NET Web API,它可以方便地自动为我的 API 生成文档,但其中一些没有意义。

以下面的截图为例。

截屏

这是GET用户 ID 的端点,在该Resource Description部分中它显示了一个表格,该表格显示了用户模型的属性,因为我的控制器操作具有[ResponseType(typeof(User))]注释。

首先,在我的实际控制器操作中,我在Password向用户显示结果之前剥离了属性,以免暴露敏感信息。所以该Resource Description部分中给出的表格是不正确的,它说我的 API 返回了它没有返回的字段。

其次,在该列下,它显示了与模型Additional Information一起使用的验证规则。User很方便,但在这种情况下根本不相关,因为这个端点是给GET用户的,而不是给一个用户的POST

所以,我的问题是如何自定义此Resource Description表以指定自己返回哪些字段并隐藏 EF 验证?

我目前已经这样评论了我的控制器操作:

/// <summary>
/// Get a single user identified by ID.
/// </summary>
/// <param name="userId">The ID of the user.</param>
/// <returns>A data collection about the user.</returns>
[ResponseType(typeof(User))]
[Route("api/v1/users/{userId}", Name="GetUser")]
[HttpGet]
public IHttpActionResult GetUser(int userId)
{
    // ...
}

并且我已将帮助页面配置为从///构建项目时从这些注释构建的 XML 文件中读取文档。

谢谢!

4

1 回答 1

1

在传统的 MVC 应用程序中,视图模型是从控制器返回到视图引擎的模型。在 Web API 应用程序中,视图模型是向 API 使用者公开的模型。

就像现在一样,您将数据模型用作视图模型。

将视图模型与数据模型分开的原因有很多:

  1. 安全性:确保敏感数据(如密码)不会意外泄露
  2. Web API 接口与数据库数据之间的数据差异(例如,enumWeb API 接口中的与int数据库中的数据)。
  3. 即使内部数据结构发生变化,也有助于确保 Web API 界面保持一致。
  4. 允许您区分数据GETPOST方法。例如,也许某些数据是在记录时确定的POST,例如记录创建日期。该数据可以从 中返回GET,但您不希望它包含在POST.

你已经找到了原因 #1 和 #2。

您的解决方案应该是:

  1. 创建一个新类作为您的视图模型。现在,您有一个User数据模型类。创建一个UserViewModel类(随意命名)。
  2. 向应向用户公开的此类添加成员。不要包括Password在你的情况下。
  3. 添加适合在自动生成的帮助中看到的注释。
  4. 将数据从User类复制到类并从控制器UserViewModel返回类。UserViewModel
于 2015-04-19T18:39:21.657 回答