Очень простой вопрос: создаются ли контроллеры в ASP.NET для каждого HTTP-запроса или они создаются при запуске приложения и повторно используются во всех запросах?
Будет ли контроллер создаваться только для определенного HTTP-запроса?
Если мои предыдущие предположения верны, могу ли я полагаться на это? Я хочу создать контекст базы данных (Entity Framework), который будет жить только для одного запроса. Если я создаю его как свойство, инициализированное в конструкторе контроллера, предоставляется ли, что новый экземпляр контекста будет создаваться для каждого запроса?
Ответы:
Контроллер создается для каждого запроса объектом
ControllerFactory
(который по умолчанию являетсяDefaultControllerFactory
).http://msdn.microsoft.com/en-us/library/system.web.mvc.defaultcontrollerfactory.aspx
Обратите внимание, что
Html.Action
Html Helper создаст еще один контроллер.Краткая версия - это то, что
ControllerActivator.Create
вызывается (для каждого запроса) для создания Контроллера (который запускает новый Контроллер либо через DependencyResolver, либо через Активатор, если Резолвер не был настроен):Более длинная версия такова (вот код из источника из MvcHandler):
Вот заводской код контроллера:
Что в основном называет это:
Что вызывает этот метод в
ControllerActivator
(Этот код пытается запросить экземпляр DependencyResolver или просто использует класс Activator):Это может подпадать под слишком много информации ... Но я хотел показать, что вы действительно получаете новый контроллер для КАЖДОГО запроса.
источник
Я создал пустой конструктор для контроллера и поставил в конструкторе точку останова. Он попадал каждый раз, когда поступал новый запрос. Думаю, он создан для каждого запроса.
источник
Html.RenderAction("action", "controller");
)Контроллер будет создан при выполнении любого действия в конкретном контроллере.
У меня есть проект, в котором все мои контроллеры наследуются от,
ApplicationController
и каждый раз, когда выполняется действие, точка останова попадает внутриApplicationController
- независимо от его « текущего » контроллера.Я инициализирую свой агент (который работает как мой контекст) всякий раз, когда мой контроллер создается следующим образом:
Очевидно, это не то, что вам нужно - как вы упомянули, вам нужен только один экземпляр при каждом его вызове. Но это хорошее место, чтобы каждый раз проверять, что происходит, и убедиться, что другой экземпляр вашего контекста в настоящее время не существует.
Надеюсь это поможет.
источник
Контроллеры создаются под каждый запрос. Волшебство происходит в маршрутизации в gobal.aspx. Пути сопоставления указывают MVC, какой контроллер нужно создать и какое действие на контроллере вызывать, а также параметры для передачи им.
http://www.asp.net/mvc/tutorials/asp-net-mvc-routing-overview-vb
источник