a continuación hay un código simple:
[SimpleFilter] public class MyController : ControllerBase { public MyController() { <---------- I put a debugger here } [Route("")] public string Get() { return DateTime.Now.ToLongTimeString(); } } public class SimpleFilterAttribute : Attribute, IAsyncResourceFilter { public SimpleFilterAttribute() { // <---------- I put a debugger here } public async Task OnResourceExecutionAsync(ResourceExecutingContext context, ResourceExecutionDelegate next) { ... } } Entonces, sabemos que cuando la aplicación se está ejecutando, creará una nueva instancia de controlador para manejar cada solicitud, por lo que si hago 5 solicitudes, entonces se actualizarán 5 instancias de MyController , puedo verificarlo colocando un depurador en el constructor de MyController, cada vez que el control va al depurador.
Así que asumo que también debería pasar lo mismo con el filtro, se creará una nueva instancia de Fiter para manejar cada nueva solicitud, pero suceden cosas extrañas como las siguientes:
1-Cuando la aplicación se inicia por primera vez, el constructor de SimpleFilter se invoca dos veces, lo que significa que se actualizaron dos instancias de SimpleFilter , entonces, ¿por qué la aplicación crea dos instancias de este filtro?
2-Después de que la aplicación se está ejecutando, cada vez que hago una nueva solicitud, no se crea una nueva instancia de SimpleFilter, parece que se usa una sola instancia de filtro para manejar todas las solicitudes, ¿es cierto? Si es cierto, ¿por qué necesitamos una nueva instancia de controlador para cada solicitud mientras que solo se necesita una única instancia de filtro para todas las solicitudes?
Pregunta interesante sobre dos veces llamado constructor de filtros.
Parece que es un comportamiento específico de CLR, no aspnet-core . Cada vez que se llama TypeInfo.GetCustomAttributes() , se crea una instancia de atributo.
Puedes comprobarlo tú mismo llamando
var typeInfo = typeof(MyController).GetTypeInfo(); var attribes = typeInfo.GetCustomAttributes(); Y mientras se construye la información del controlador, se llama a TypeInfo.GetCustomAttributes() al menos 2 veces https://github.com/dotnet/aspnetcore/blob/main/src/Mvc/Mvc.Core/src/ApplicationModels/DefaultApplicationModelProvider.cs#L110