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



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

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

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

特别是ApiBehaviorApplicationModelProvider,它包含以下检查:

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,它基本上只是将MVC过滤器ModelStateInvalidFilter添加到管道中。

这样,API控制器中的动作就会根据选择的约定有一个调整的行为。

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

相关内容