我正在修复大量使用会话来跟踪每页数据的ASP.NET应用程序。其中一个问题是会话在页面之间流血。使用像ViewState这样的会话
ViewState的将是一个更好的解决办法,除非:
- 的数据是不可序列
- 有太多的数据每次回发
所以我想被发送来回:
- 为会话数据创建页面密钥(即在隐藏字段中粘贴一个随机GUID)
- 从一个废弃的页面过期数据,即使整个会话活跃
是否有到期部分会话的数据的好方法吗?
我正在修复大量使用会话来跟踪每页数据的ASP.NET应用程序。其中一个问题是会话在页面之间流血。使用像ViewState这样的会话
ViewState的将是一个更好的解决办法,除非:
所以我想被发送来回:
是否有到期部分会话的数据的好方法吗?
下的临时存储位置可供选择:
您可能需要检查缓存。如果您使用的是网站农场,它不起作用,但您可以使用某种类型的GUID作为您映射回会话的密钥。
如果我可以保证缓存可能会在会话持续20分钟左右的时间内完成。 – Korey 2009-08-13 15:34:32
这里是我使用的缓存代码: Cache.Insert(key,value,null,System.Web.Caching.Cache.NoAbsoluteExpiration,new TimeSpan(0,20,0),System.Web.Caching.CacheItemPriority.NotRemovable , 空值); – Korey 2009-08-14 20:54:29
CacheItemPriority.NotRemovable阻止Cache由于内存压力而删除数据。 – Korey 2009-08-14 20:55:02
也许在每个页面!IsPostBack或通过基本页面,您可以清空所有对与该页面无关的会话数据的引用。每次用户转到站点中的其他页面时,这会使数据“过期”。
如果用户离开网站或处于非活动状态,则在会话过期之前可以做的事情不多,但在这种情况下,每个用户只有一页会话数据。
我确实希望允许查看多个页面(同一页面,但具有不同的请求数据)。我不希望一个页面自动销毁另一个会话数据,我只是希望它能够过期。 – Korey 2009-08-13 15:35:34
我可能会做这种方式:
像这样的东西(警告:空气代码可能包含语法错误):更多
public class PageBase
: System.Web.UI.Page
{
protected overrides OnInit(System.EventArgs e) {
base.OnInit(e);
if(!this.IsPostBack) {
Guid requestToken = System.Guid.NewGuid();
ViewState["RequestToken"] = requestToken;
Session["PageSpecific" & requestToken.ToString()] = InitializePageSpecificState();
}
}
protected virtual object InitializePageSpecificState() {
return new GenericPageState();
}
//You can use generics to strongly type this, if you want to.
protected object PageSpecificState {
get {
return Session["PageSpecific" & ViewState["RequestToken"].ToString()];
}
}
}
这与以前的答案有相同的问题。我的问题可能不够清楚。 某些用户可能在多个选项卡中查看Default.aspx,并使用不同的请求数据(甚至相同)。我希望每个人都有自己的服务器端存储空间。 – Korey 2009-08-13 15:42:15
@Korey这将是一个好东西编辑到您原来的问题。它也很容易解决:在初始加载时生成某种形式的令牌(如Guid)。将其附加到会话密钥(会话[“PageSpecific”&requestToken])。将密钥存储在ViewState中。 – AaronSieb 2009-08-13 16:30:05
@Korey允许多个选项卡打开的主要困难是您无法从请求中清除会话,直到整个会话过期为止......这可能会也可能不会成为问题,具体取决于您的大小用户群。 – AaronSieb 2009-08-13 16:35:45
有点信息将是有益的。您是否试图为每个页面存储相同的数据结构,或者每个页面有唯一的数据结构?为什么会话数据在用户离开后闲逛会出现问题? – 2009-08-13 13:32:16
@Christian Hayter他的问题意味着多个页面使用相同的会话密钥。因此,针对页面A的数据将留在会话中供页面B查找。 – AaronSieb 2009-08-13 13:51:26
AaronSieb是正确的。 – Korey 2009-08-13 15:43:41