首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >控制器是为每个请求创建的吗? ASP.NET?

控制器是为每个请求创建的吗? ASP.NET?
EN

Stack Overflow用户
提问于 2011-03-25 05:41:05
回答 3查看 46.6K关注 0票数 123

非常简单的问题: ASP.NET中的控制器是为每个HTTP请求创建的,还是在应用程序启动时创建并在整个请求中重用的?

是否只为特定的HTTP请求创建控制器?

如果我之前的假设是正确的,我可以依赖它吗?我想创建数据库上下文(实体框架),它将只为一个请求而存在。如果我将其创建为在控制器的构造函数中初始化的属性,是否允许为每个请求创建新的上下文实例?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-03-25 06:00:49

ControllerFactory (默认情况下是DefaultControllerFactory)为每个请求创建一个控制器。

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

请注意,Html.Action Html Helper将创建另一个控制器。

简而言之,(对于每个请求)调用ControllerActivator.Create来创建控制器(通过DependencyResolver或通过激活器(如果没有设置解析器)来初始化一个新的控制器):

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

更长的版本是这样的(这里是来自MvcHandler源代码的代码):

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));
    }
}

以下是控制器工厂代码:

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

这就是所谓的:

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

它在ControllerActivator中调用此方法(此代码尝试向DependencyResolver请求一个实例,或仅使用Activator类):

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

这可能属于太多的信息...但我想展示的是,对于每个请求,您确实会获得一个新的控制器。

票数 108
EN

Stack Overflow用户

发布于 2011-03-25 05:52:03

我为控制器创建了一个空的构造函数,并在构造函数中放置了一个断点。每当有新的请求时,它就会受到攻击。所以我认为它是为每个请求创建的。

票数 34
EN

Stack Overflow用户

发布于 2011-03-25 05:57:27

为每个请求创建控制器。神奇之处在于gobal.aspx中的路由。映射路径指导MVC创建哪个控制器,调用控制器上的操作,以及传递给它们的参数。

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5425920

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档