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.
[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.