ASP.NET MVC: czy kontroler jest tworzony dla każdego żądania?

Bardzo proste pytanie: czy Kontrolery w ASP.NET utworzone dla każdego żądania HTTP, czy też są one tworzone przy starcie aplikacji i ponownie wykorzystywane w żądaniach?

Czy kontroler zostanie utworzony tylko dla określonego żądania HTTP?

Jeśli moje poprzednie założenia są poprawne, czy Mogę na nich polegać? Chcę utworzyć kontekst bazy danych (Entity Framework), który będzie działał tylko dla jednego żądania. Jeśli utworzę ją jako właściwość zainicjalizowaną w konstruktorze kontrolera, czy jest to instancja kontekstu zostanie utworzona dla każdego żądania?

Author: Siavas, 2011-03-25

4 answers

Kontroler jest tworzony dla każdego żądania przez ControllerFactory (domyślnie jest to DefaultControllerFactory).

Http://msdn.microsoft.com/en-us/library/system.web.mvc.defaultcontrollerfactory.aspx

Zauważ, że Html.Action HTML Helper utworzy kolejny kontroler.

Skrócona wersja jest taka, że ControllerActivator.Create jest wywoływana (dla każdego żądania) do utworzenia kontrolera (który inits nowy kontroler albo przez DependencyResolver lub przez aktywator jeśli nie ustawiono Resolvera):

public IController Create(RequestContext requestContext, Type controllerType) {
                    try {
                        return (IController)(_resolverThunk().GetService(controllerType) ?? Activator.CreateInstance(controllerType));
                    }

Dłuższa wersja jest taka (oto Kod ze źródła z Mvchandlera)

 protected internal virtual void ProcessRequest(HttpContextBase httpContext)
    {
        SecurityUtil.ProcessInApplicationTrust(() =>
        {
            IController controller;
            IControllerFactory factory;
            ProcessRequestInit(httpContext, out controller, out factory);

            try
            {
                controller.Execute(RequestContext);
            }
            finally
            {
                factory.ReleaseController(controller);
            }
        });
    }

private void ProcessRequestInit(HttpContextBase httpContext, out IController controller, out IControllerFactory factory)
        {
            //non relevant code

            // Instantiate the controller and call Execute
            factory = ControllerBuilder.GetControllerFactory();
            controller = factory.CreateController(RequestContext, controllerName);
            if ( controller == null )
            {
                throw new InvalidOperationException(
                    String.Format(
                        CultureInfo.CurrentCulture,
                        MvcResources.ControllerBuilder_FactoryReturnedNull,
                        factory.GetType(),
                        controllerName));
            }
        }

Oto kod fabryczny kontrolera

 public virtual IController CreateController(RequestContext requestContext, string controllerName) {
            Type controllerType = GetControllerType(requestContext, controllerName);
            IController controller = GetControllerInstance(requestContext, controllerType);
            return controller;
        }

Który w zasadzie nazywa to:

protected internal virtual IController GetControllerInstance(RequestContext requestContext, Type controllerType) {
            return ControllerActivator.Create(requestContext, controllerType);
        }

Który wywołuje tę metodę w Controlleractivatorze (ten kod próbuje zapytać o instancję DependencyResolver, lub po prostu używa klasy Activator):

public IController Create(RequestContext requestContext, Type controllerType) {
                try {
                    return (IController)(_resolverThunk().GetService(controllerType) ?? Activator.CreateInstance(controllerType));
                }
To może być zbyt wiele informacji... Ale chciałem ci pokazać, że naprawdę dostać nowy kontroler dla każdego żądania.
 79
Author: Linkgoron,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-03-24 22:38:58

Stworzyłem pusty konstruktor dla kontrolera i umieściłem w nim punkt przerwania. Obrywał za każdym razem, gdy pojawiała się nowa Prośba. Myślę, że jest stworzony na każdą prośbę.

 26
Author: Bala R,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-03-27 00:52:32

Kontroler zostanie utworzony, gdy zostanie wykonana Dowolna akcja w określonym kontrolerze.

Mam projekt, w którym wszystkie moje Kontrolery dziedziczą po ApplicationController i za każdym razem, gdy wykonywana jest akcja, punkt przerwania jest uderzany wewnątrz ApplicationController - niezależnie od jego kontrolera "current ".

Inicjuję mojego agenta (który działa jako mój kontekst), gdy mój kontroler jest tworzony w taki sposób:

    public IWidgetAgent widgetAgent { get; set; }

    public WidgetController()
    {
        if (widgetAgent == null)
        {
            widgetAgent = new WidgetAgent();
        }

    }

To oczywiście nie jest to, czego potrzebujesz - jak wspomniałeś, że chciał tylko jednej instancji za każdym razem, gdy został wywołany. Ale jest to dobre miejsce, aby sprawdzić, co się dzieje za każdym razem i upewnić się, że inna instancja twojego kontekstu nie istnieje.

Mam nadzieję, że to pomoże.
 2
Author: Rion Williams,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-06-25 18:24:56

Kontrolery są tworzone dla każdego żądania. Magia dzieje się w routingu w gobal.aspx. Ścieżki mapowania kierują MVC, do którego kontroler ma zostać utworzony i do którego kontroler ma zostać wywołany, oraz parametry, które mają zostać do nich przekazane.

Http://www.asp.net/mvc/tutorials/asp-net-mvc-routing-overview-vb

 1
Author: BlackICE,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-03-24 21:57:27