ApiControllerAttribute 如何工作,因为根本没有实现它

How does ApiControllerAttribute works as there is no implementation of it at all

[ApiControllerAttribute] 做了 4 件事,例如自动模型验证。但是当我寻找它的源代码来覆盖它的行为时,里面没有代码:https://github.com/dotnet/aspnetcore/blob/457ade0b771697ff6f99f8138098e223e56326d6/src/Mvc/Mvc.Core/src/ApiControllerAttribute.cs 还有它继承的 类 和它实现的接口没有方法。 那么它是如何做的呢?

.NET 中的属性通常只是注释,就像标记一样,不会 运行 自行编写代码。只有一些属性(例如 ValidationAttribute)也包含实际逻辑,但这些属性随后会被其他组件触发。

[ApiController] 属性的情况下,这只是将 class 标记为具有 IApiBehaviorMetadata 类型的注释。然后有一些地方会检查是否存在这样的属性,然后更改行为。

特别是 ApiBehaviorApplicationModelProvider which contains the following check:

private static bool IsApiController(ControllerModel controller)
{
    if (controller.Attributes.OfType<IApiBehaviorMetadata>().Any())
    {
        return true;
    }

    var controllerAssembly = controller.ControllerType.Assembly;
    var assemblyAttributes = controllerAssembly.GetCustomAttributes();
    return assemblyAttributes.OfType<IApiBehaviorMetadata>().Any();
}

当模型提供者找到一个 API 控制器时,它将应用一些约定,例如将 InvalidModelStateFilterConvention which basically just adds the MVC filter ModelStateInvalidFilter 应用到管道中。

这样,API 控制器内的操作将根据选定的约定调整行为。

还有其他地方,例如在分析器中,检查 API 控制器属性是否存在,例如使用内部 IsApiControllerAction method.