【问题标题】:sql server session in master page and in aspx page母版页和 aspx 页面中的 sql server 会话
【发布时间】:2011-08-28 03:07:41
【问题描述】:

我正在使用 SQL 服务器会话状态。

如果我正在使用调用存储在会话中的一些变量的母版页,然后稍后在后面的 aspx 代码中再次使用会话,是否会触发:

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

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

谢谢。

【问题讨论】:

    标签: asp.net session


    【解决方案1】:

    母版页是附加到页面的用户控件,并被视为这样。因此,这个问题不仅适用于母版页,还适用于附加到页面的所有用户控件、自定义控件和标准控件。

    SQL Server 存储的会话状态会根据请求在 SQL Server 中序列化/反序列化。这不是变量的请求,而是 HTTP 请求本身。

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

    因此,为了回答您的问题,在页面生命周期开始时(在 INIT 之前)只需一次调用 SQL Server 即可获取整个会话变量集,无论您在会话状态中有多少变量.然后在页面生命周期结束时(这是在 RENDER 和 UNLOAD 之后)有第二个数据库调用来存储会话状态

    【讨论】:

    • 哦,顺便说一句,如果我在请求甚至到达 aspx 之前触发的 http 模块中使用会话,1 请求 = 1 会话读取的原则是否仍然成立?
    • 是的。 AcquireRequestState 和 ReleaseRequestState 事件实际上发生在 HTTP 模块级别。
    【解决方案2】:

    读取将只产生 1,会话对象在请求开始时从存储区重新创建。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-09-16
      • 2013-05-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多