【问题标题】:Are ASP.NET controllers guaranteed to be used only once per request?ASP.NET 控制器是否保证每个请求只使用一次?
【发布时间】:2009-11-05 00:59:55
【问题描述】:

如果我们想创建一些对象供控制器中的所有操作方法使用,我们可以将它们作为实例变量存储在控制器中吗?

Phil Haack 在这篇旧文章中提到控制器不应该被重用: Asp.Net MVC Beta: Previous RouteData overrides current RouteData?

但是这种每个请求一个控制器的行为是否得到保证?

我不希望重用的控制器有来自另一个请求的数据。

【问题讨论】:

  • 您是否尝试过使用SessionCache应用程序 ?

标签: asp.net-mvc


【解决方案1】:

是(对您标题中的问题)和否(对您帖子中的问题)。

为每个请求创建一个新的控制器实例。您可以通过使用自己的控制器工厂来缓存控制器并仅根据需要创建它们,但我不推荐这样做。您最好在 Session 或 Cache 中简单地缓存所需的任何信息,或者将信息存储在 View 中(如果需要,隐藏),而不是创建新的控制器工厂。

【讨论】:

  • 为了澄清,我试图了解创建一些数据以供多个操作方法在一个地方共享的最佳方法。我试图找出将数据从 OnActionExecuting 传递到操作方法的最佳方法。我没有意识到我们可以在 controllerContext 上填充 ViewData,这似乎比控制器内的实例变量更有意义。我想我的问题得到了回答:是的,每个请求只有一个控制器。
  • 在一个拥有超过 4000 个并发的网站中,哪种方式是性能的最佳方式? 会话缓存应用程序?跨度>
【解决方案2】:

每次调用操作方法时,都应创建控制器类的新实例。因此,让您的操作方法依赖于实例变量并不是一个好主意。如果您使用 DefaultControllerFactory,那么您将为每个请求获得一个新的控制器实例。如果您使用自定义控制器工厂,您可以覆盖此行为,我不建议这样做。

【讨论】:

  • 是否会创建一个新的控制器实例来调用 ChildActions?
【解决方案3】:

您可以使用 TempData 在控制器中存储临时数据

【讨论】:

  • 在后续请求之前,TempData 不存在吗?
  • OP 明确指定我引用:I don't want to be in a situation where a reused controller has data from another request.。使用 TempData 将做到这一点:重用来自先前请求的数据。
  • 当你说actions 这意味着多个请求(每个操作请求),也许你的意思是current session/user
  • 我会从你的回答中删除反对票,因为 OP 实际上并没有具体说明他是指来自同一用户的不同请求还是不同请求。
  • 我的意思是,如果在对特定操作的请求中存在 RedirectToAction 方法,则 tempData 中的数据会持续存在。之后是的,也许我错了。
猜你喜欢
  • 2011-07-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多