【问题标题】:Manually create/populate .NET Session object手动创建/填充 .NET Session 对象
【发布时间】:2011-07-21 22:00:16
【问题描述】:

首先简要介绍一下背景。我正在使用 .NET 输出缓存和替换控件来保持在每次页面刷新时更新一些位。替换控件使用的静态方法需要访问 Session 对象。不幸的是,这些方法中的 HttpContext 会话为空。

我不会重写我的应用程序以使用与 Session 不同的商店。除了这一方面,Session 非常适合我需要的一切。

我可以手动创建或填充会话对象或通过某种黑魔法获取其数据吗?会话 cookie 仍在从客户端设置到服务器。信息必须在某个地方。我该怎么办?

【问题讨论】:

    标签: c# asp.net session caching


    【解决方案1】:

    我不相信这是一个“好”的方法...但是您可以非常巧妙地将 Session 的引用存储在共享/静态变量中,然后访问它。

    Public Class SessionHelper
    
        Public Shared TheSession As HttpSessionState
    
    End Class
    

    在您的 Session Start 事件中(据我所知,还没有找到放置它的最佳位置,因为该会话在 Application start 中不可用)

    Sub Session_Start(ByVal sender As Object, ByVal e As EventArgs)
    
        ' Store a reference...only do this once etc etc
        If SessionHelper.TheSession Is Nothing Then
            SessionHelper.TheSession = HttpContext.Current.Session
        End If
    
    End Sub
    

    然后在你的代码中你可以只引用助手

    Dim someVariable as String = SessionHelper.TheSession.Item("ItemName")
    

    关于这种方法的一些事情我不确定:

    • 不确定会话对象现在是否不是线程安全的
    • 好像不太对劲
    • 这个例子非常简单……

    编辑
    我通过向缓存中添加一些内容并查看会话在 Http.Context.Current 不可用的缓存删除回调中是否可用来验证这对我有用。

    编辑 2
    这是正确返回值的屏幕截图。所以它必须在某种程度上起作用,但是没有设置 SessionId 的事实有点令人担忧......我知道我以前使用过这种技术来访问 Cache 对象但缓存是缓存,其中会话确实需要一些东西来识别每个会话......无论如何,你去吧:

    【讨论】:

    • 这绝对看起来很老套,我可能会后悔这样做,但这对我有用,我会去的。我将其更改为将会话存储在 Dictionary<string, HttpSessionState> 中,其中键是 SessionID。这样,我的线程安全性更高。
    • 这不起作用。并不真地。我能够参考该会话,但它没有任何项目。您是否能够使用您的方法访问项目集合?
    • 我会检查...但是,请记住,您不是存储“每个”会话...只是将会话对象作为一个整体...因此您只需要存储一次即可感觉...
    • @Jeff,查看编辑...想我可能会删除这个答案,因为它可能没有好处...看看你的想法。
    • 我真的让它工作了。我不确定到底是什么问题,但我没有在会话开始时保存对会话的引用,而是在Page_Load 事件或类似事件期间访问它时保存了它。
    【解决方案2】:

    会话信息存储在服务器的内存中。但是,您可以configure ASP.NET to store the session information inside SQL Server

    【讨论】:

    • 数据库调用没有性能开销吗?我以前看过有关这方面的文章,但总是回避。
    • @Jeff - 是的,它肯定会在一定程度上降低性能。不是很大程度,但在某种程度上。如果您的应用程序对速度敏感,那么这可能不是要走的路。另一种方法是 this artice,它是一个允许您探索和查看会话状态的工具。
    • @m4tt1mus - 如果数据在数据库中,那么您只需使用查询分析器从表行中提取数据即可查看会话数据
    • 您可能应该在答案中包含这一点,只是切换到将会话状态存储在 SQL 中并不能解决问题。
    【解决方案3】:

    HttpContext.Current.Session 应该允许您访问当前会话。唯一不起作用的情况是没有当前的 HttpContext。只要您有对 System.Web 的引用,它就应该可以工作。

    【讨论】:

    • 它不起作用。 HttpContext.Current.Session 为空。甚至 Scott Guthrie 也被引用说在我的情况下它不可用。
    • 这完全取决于您的代码尝试访问 Session 的页面管道的哪个阶段。如果当前处理程序实现了 IRequiresSessionState 或 IReadOnlySessionState,则 Session 将可用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-31
    • 1970-01-01
    • 2020-03-14
    • 2016-09-03
    • 1970-01-01
    相关资源
    最近更新 更多