Я подозреваю, причина в том, что вы используете Security Trimming. Чтобы определить, имеет ли каждая ссылка доступ, MVCSiteMapProvider создает и освобождает экземпляр каждого контроллера для каждого действия. Единственный способ избежать этого - отключить обрезку безопасности.
С включенной обрезкой безопасности не рекомендуется иметь какую-либо тяжелую обработку внутри ваших конструкторов, так как это отрицательно скажется на производительности. Вы должны отложить любую обработку (например, открытие соединений с базой данных), чтобы позже в жизненном цикле запроса, используя Abstract Factory, чтобы создать соединение и впрыснуть завод в свой конструктор вместо объекта dbcontext/connection. См. Пример this post.
Это говорит о том, что AuthorizeAttributeAclModule
не так эффективен, как могло бы быть, потому что, когда у вас есть контроллеры с множеством методов действий, один и тот же экземпляр контроллера можно было бы повторно использовать, а не создавать для каждого метода действий. Вы можете сделать обычай AuthorizeAttributeAclModule
и использовать словарь HttpContext.Items
для запроса-кеширования каждого контроллера, чтобы они повторно использовались, а не повторно инициализировались. Однако вам нужно будет сделать рефакторинг. Контроллер создан на line 235, и он выпущен на line 108. Вы должны убедиться, что релиз не вызывается до тех пор, пока не будет проверен последний последний узел. Вы можете сделать это, создав IActionFilter
, чтобы освободить их после завершения действия, но это означает, что метод действия должен знать о том же кеше запросов (в HttpContext.Items
) как AuthorizeAttributeAclModule
. Вам просто нужно реализовать метод OnActionExecuted
для очистки контроллеров от кеша запросов.
Спасибо. Я отключил обрезку безопасности, а затем использовал репозиторий для фильтрации меню по ролям. Но я обнаружил, что нулевое значение absoluteCacheExpiration вызвало недопустимое меню, если я вхожу в систему как пользователь. Я уверен, что absoluteCacheExpiration минимизирует количество фильтров. Думаю, мне нужно поднять еще одну тему для этого после некоторых исследований. Спасибо за вашу помощь. –