gpt4 book ai didi

.net - ASP.NET MVC : Is Controller created for every request?

转载 作者:行者123 更新时间:2023-12-03 04:51:01 28 4
gpt4 key购买 nike

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

是否仅为特定的 HTTP 请求创建 Controller ?

如果我之前的假设是正确的,我可以依赖它吗?我想创建仅适用于一个请求的数据库上下文( Entity Framework )。如果我将其创建为在 Controller 的构造函数中初始化的属性,是否会为每个请求创建新的上下文实例?

最佳答案

ControllerFactory 的每个请求创建一个 Controller 。 (默认情况下是 DefaultControllerFactory )。

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

请注意 Html.Action Html Helper 将创建另一个 Controller 。

简短的版本是 ControllerActivator.Create被调用(对于每个请求)来创建一个 Controller (如果没有设置解析器,则通过 DependencyResolver 或通过 Activator 初始化一个新的 Controller ):

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

这是 Controller 工厂代码:

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

这可能涉及太多信息......但我想表明您确实为每个请求都获得了一个新的 Controller 。

关于.net - ASP.NET MVC : Is Controller created for every request?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5425920/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com