2011-08-28 99 views
2

我正在使用SQL服务器会话状态。master页面和aspx页面中的sql服务器会话

如果我使用的呼唤存储在会话中的几个变量,母版页,然后再在后面的ASPX代码以后使用会话,这是否触发:

一)2数据库中读取,1在母版页进程期间和第二次在aspx运行时。

b)1数据库读取,会话在母版页过程中加载并在页面的生命周期中持续存在。

谢谢。

回答

3

主页面是连接到页面的用户控件,并按此处理。因此,这个问题不仅适用于母版页,而且适用于附加到页面的所有用户控件,自定义控件和标准控件。

根据请求,SQL Server存储的会话状态将被串行化/反序列化到SQL Server中或从SQL Server中反序列化。这不是变量的请求,而是HTTP请求本身。

在页面生命周期中,值将在AcquireRequestState事件中检索,并推送到ReleaseRequesteState中。这些事件是HttpModule系统的各个方面,并且由Page类继承。

因此,要回答您的问题,只需在页面生命周期开始时(INIT前)向SQL Server发送一个调用即可获取整组会话变量,而不管Session中有多少个变量州。然后在页面生命周期结束时(这是在RENDER & UNLOAD之后)还有第二个数据库调用来存储会话状态

+0

喔,顺便说一句,如果我是触发前的请求连撞ASPX一个HTTP模块中使用这个会话,并请求1 = 1届的原则读取仍持有? – frenchie

+0

是的。 AcquireRequestState和ReleaseRequestState事件实际发生在HTTP模块级别。 –

+0

好吧,酷,那么就像一个魅力! – frenchie

2

读取结果只有1,会话对象从请求开始。

当页面将数据保存到Session时,该值将加载到由HttpSessionState类承载的定制字典类中。当正在进行的请求完成时,字典的内容被刷新到状态提供程序。如果会话状态是空的,因为没有数据被编程放在字典里,没有数据序列化到存储介质,更重要的是,没有插槽无论是在ASP.NET缓存,SQL Server或NT状态服务创建跟踪当前会话。这是出于性能方面的考虑这样做,但对其中的会话ID的处理方式的关键反响:为每个请求生成一个新的会话ID,直到一些数据被存储在会话字典。 - 看到http://msdn.microsoft.com/en-us/library/aa479041.aspx更多细节