对启动,全局,应用程序和会话的困惑

时间:2014-05-23 16:05:49

标签: asp.net asp.net-mvc owin

我试图了解存储和实例化应用程序(即每个用户可用的对象)和会话级别(仅为其会话创建并可供用户使用的对象)变量的各种存储和实例化方法。另外,OWIN如何适应所有这些?

  1. Global.asax.cs - 这可以包含许多不同的方法。我相信只在第一次请求期间调用Application_Start。但是,这里有一些候选者可以填充会话级变量(例如Session_Start和Application_BeginRequest)。这样做的标准方法是什么?

  2. 还有OWIN使用的Startup类。我知道OWIN允许您存储应用程序级别变量,但为什么不使用可从Global.asax.cs访问的HttpApplicationState应用程序变量来实现此目的?另外 - OWIN可以处理会话变量吗?

2 个答案:

答案 0 :(得分:0)

  

“我相信Application_Start只会在第一次调用时调用   请求。“

仅在调用Web应用程序后的第一个请求。例如,在部署,ApplicationPool回收,重新启动或退出睡眠之后就是这种情况。

假设有3位用户访问您的网络应用程序。只会为其中一个调用Application_Start,特别是第一个访问它的人。因此,它不适合填充特定于用户的会话值。

  

但是,这里有一些候选者可以填充会话级变量(例如Session_Start和Application_BeginRequest)。这样做的标准方法是什么?

过去我曾与Session_Start合作,在众多项目中初始化特定于用户的会话值(如默认值),并且从未遇到任何问题。

答案 1 :(得分:0)

正如我在评论中所说,我真的不确定问题是什么。我坦率地说,我会忽略OWIN的东西,因为我不知道。

首先,尽量不要存储状态。设计在模型或URL中的服务器和客户端之间来回传递状态,甚至在客户端的HTML中,例如在<a>标记您的渲染中的URL中,或者(很少)在cookie中,而不是把事情记在心里。无状态设计更具可扩展性。

存储状态不是“通常”在Global.asax完成,而是通常的情况?我在需要时存储状态,加载它或以其他方式来获取数据。对于MVC中的我来说,这通常是Controller操作的下游,可能是在记录某人,或者读取模型中收到的一些数据时,例如客户点击“添加到购物车”。

应用程序状态我很少使用,尽管我在长期静态类中的普通字段和属性中存储长寿和共享数据。当应用程序被回收时,这些会死掉,但我通常不在乎,因为应用程序的设计是在没有应用程序的情况下工作,无状态;它通常是缓存的数据。

此外,Session_Start仅在新浏览器/代理点击网站时触发。那时你不认识用户。

Global.asax中的方法并非专为'bootstrapping'状态加载而设计,它们只是用于执行任何操作的便捷事件。您根本不必使用它们,我通常只包含日志记录,因此我知道会话何时开始等等。

我不知道这是否有帮助。

一旦你有了计划,请回来询问有关OWIN内容的有针对性的问题。