api 资源管理器文档动态忽略控制器上的 WebAPI 方法

Dynamically Ignore WebAPI method on controller for api explorer documentation

我们已经实现了一个 webAPI 并且我们有许多 API 控制器。 我们为我们的 API 提供了一个 API 文档,我们想要做的是从文档中排除某些网络方法,但我们希望根据我们所处的环境动态地完成此操作 运行 . 只是为了让您理解我的意思,假设我有以下网络方法

[ApiExplorerSettings(IgnoreApi = true)] 
public Product getProduct()
{
   ...
}

通过将 ApiExplorerSettingAttribute 上的 IgnoreAPI 属性 设置为 true,它从文档中排除了我们想要的 web 方法,但我们需要一种方法来设置 "true" 动态值。 理想情况下,我们希望有一个数据库 table,其中包含每个 webMethod 的 bool 值,并基于这些设置 IgnoreAPI 属性 的值。 有没有办法做到这一点?非常感谢您的帮助。

我对WebAPI的文档生成了解不多,但是我知道属性。属性被编译到代码中,导致硬编码值直接保存在 EXE 或 DLL 的数据中。它们无法更改。

话虽如此,您也许可以在正常编译后将属性作为第二组应用。也许 PostSharp 可以帮上忙?也许更改解决方案配置可能是一种指示您要为其构建的环境以及哪些方法获得 IgnoreApi 处理的方法。您可以创建自己的属性以应用于描述方法应在哪些环境中被忽略的方法。 (我认为如果您不尝试调用数据库来获取这些数据,您更有可能在 PostSharp 中做您想做的事。)

您可以实施自定义 IApiExplorer 并将其注册到 Web API 的服务中,以完全控制列出或不列出哪些 API。

这是实现大部分内容的开发人员的博客 post:https://docs.microsoft.com/en-us/archive/blogs/yaohuang1/asp-net-web-api-introducing-iapiexplorerapiexplorer

下面是 IApiExplorer 接口定义:http://msdn.microsoft.com/en-us/library/system.web.http.description.iapiexplorer(v=vs.118).aspx

你可以做的一件事是从现有的 ApiExplorer 实现中派生(或重新使用现有的源)并调用 base 来获取默认列表,然后进一步过滤它你要。

并且根据 s_hewitt 的评论,建议是:

Deriving from ApiExplorer, implementing the two methods ShouldExploreAction and ShouldExploreController is the way to go. Make your DB calls in those two methods, looking up based on route, controller and action.