Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 手动创建/填充.NET会话对象_C#_Asp.net_Session_Caching - Fatal编程技术网

C# 手动创建/填充.NET会话对象

C# 手动创建/填充.NET会话对象,c#,asp.net,session,caching,C#,Asp.net,Session,Caching,首先是简要的背景。我使用.NET输出缓存和替换控件在每次页面刷新时更新一些位。替换控件使用的静态方法需要访问会话对象。不幸的是,这些方法中的HttpContext会话为空 我不会重写我的应用程序以使用与会话不同的存储。会议是完美的一切,我需要除了这一方面 我可以手动创建或填充会话对象,或者通过某种黑魔法获取其数据吗?会话cookie仍在从客户端设置到服务器。信息一定在某个地方。如何获取它?会话信息存储在服务器的内存中。但是,您可以。HttpContext.Current.Session应该允许您

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

我不会重写我的应用程序以使用与会话不同的存储。会议是完美的一切,我需要除了这一方面


我可以手动创建或填充会话对象,或者通过某种黑魔法获取其数据吗?会话cookie仍在从客户端设置到服务器。信息一定在某个地方。如何获取它?

会话信息存储在服务器的内存中。但是,您可以。

HttpContext.Current.Session应该允许您访问当前会话。只有在没有当前HttpContext的情况下,这种方法才会起作用。只要你有一个对System.Web的引用,它就应该可以工作。

我不认为这是一个“好”的方法……但是你可以非常巧妙地将对会话的引用存储在一个共享/静态变量中,然后访问它

Public Class SessionHelper

    Public Shared TheSession As HttpSessionState

End Class
在您的会话启动事件中(据我所知,由于会话在应用程序启动中不可用,因此尚未找到放置它的最佳位置)

然后在代码中,您可以只引用帮助器

Dim someVariable as String = SessionHelper.TheSession.Item("ItemName")
对于这种方法,有几点我不确定:

  • 不确定会话对象现在是否不是线程安全的
  • 这似乎不太对
  • 这个例子非常简单
编辑
我向缓存中添加了一些内容,并查看会话是否在缓存移除回调中可用,而Http.Context.Current在该回调中不可用,从而验证了这一点

编辑2
下面是正确返回值的屏幕截图。因此,它一定在某种程度上起作用,但SessionId未设置的事实有点令人担忧……我知道我以前使用过这种技术来访问缓存对象,但缓存就是缓存,因为会话确实需要一些东西来标识每个会话……不管怎样,这里是:

数据库调用不存在性能开销吗?我以前看过有关这方面的文章,但总是避而不谈。@Jeff-是的,它肯定会在一定程度上降低性能。不是很大程度,但在某种程度上。如果您的应用程序对速度敏感,那么这可能不是解决问题的方法。另一种方法是读取,这是一种允许您探索和查看会话状态的工具。@m4tt1mus-如果数据在数据库中,则您可以通过使用查询分析器从表行中提取数据来查看会话数据。您可能应该在回答中包含该数据,仅仅切换到在SQL中存储会话状态并不能解决问题,它不起作用
HttpContext.Current.Session
为空。甚至有人引用Scott Guthrie的话说,在我的情况下它是不可用的。这完全取决于您的代码试图访问会话的页面管道的哪个阶段。如果当前处理程序实现了IRequireResessionState或IReadOnlySessionState,那么会话将可用。这显然看起来很粗糙,我可能会后悔这么做,但这对我来说很有效,我会努力的。我将其更改为将会话存储在
字典中,其中键是SessionID。这样,我的线程就更安全了。这不起作用。不是真的。我可以参考会议,但没有任何项目。您是否能够使用您的方法访问items集合?我会检查…但是,请记住,您没有存储“每个”会话…只是将会话对象作为一个整体…因此,如果有意义,您只需要存储一次…@Jeff,请看编辑…我想我可能会删除这个答案,因为它可能不好…请看你的想法。我确实让它起作用了。我不确定问题到底是什么,但不是在会话开始时保存对会话的引用,而是在
Page\u Load
事件或类似事件期间访问会话时保存的。
Dim someVariable as String = SessionHelper.TheSession.Item("ItemName")