使用像ViewState这样的会话

时间:2009-08-13 13:27:37

标签: asp.net session viewstate

我正在修复一个ASP.NET应用程序,该应用程序大量使用会话来跟踪每页数据。其中一个问题是会话在页面之间流血。

ViewState是一个更好的解决方案,除了:

  • 数据不可序列化
  • 每次回发都有太多的数据来回发送

所以我想:

  • 为会话数据创建页面密钥(即在隐藏字段中粘贴随机GUID)
  • 即使整个会话处于活动状态,也会从已放弃的页面中过期数据

有没有一种方法可以使部分会话数据到期?

3 个答案:

答案 0 :(得分:2)

以下临时存储位置可用:

  1. 会话。这跟在用户身边并使用cookie。它可以配置为使用URL参数进行检索。会话还可以配置为存储在Web服务器,SQL Server或状态服务器中的进程(inproc)中。 InProc可以存储任何数据类型,但其他类型要求类型可序列化。
  2. 高速缓存。存储在缓存中的数据可供会话中的任何用户使用。它的工作方式与会话类似,因为对象可通过密钥检索。缓存的一个更好的功能是,您可以控制存储的时间长度,并且可以在事件过期时使用它。您可以在此处存储任何内容,但在webfarm中使用它时可能会遇到问题。
  3. HttpContext的。这是作为当前请求的范围。请记住,请求可以是webservice调用,调用获取网页以获取HTML,或调用返回图像的服务。任何东西都可以存放在这里。
  4. 视图状态。视图状态的范围限定为页面。必须是可序列化的。
  5. 您可能想要检查缓存。如果您使用的是webfarm,它将无法使用,但您可以使用某种GUID作为映射回会话的密钥。

答案 1 :(得分:1)

我可能会这样做:

  1. 创建一个对象以存储您想要特定于页面的状态信息。如果不同的页面需要不同的信息,请创建多个类。
  2. 将此对象存储在单个会话密钥中:Session [“PageSpecific”];例如。
  3. 创建一个继承自System.Web.UI.Page。
  4. 的类
  5. 在基类的OnLoad事件中,如果页面未执行回发,请清除会话密钥。
  6. 创建并调用一个可重载的方法来填充会话对象。
  7. 不是从每个页面中的System.Web.UI.Page继承,而是从新的基类继承。
  8. 这样的事情(警告:航空代码。可能包含语法错误):

    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()];
            }
        }
    }
    

答案 2 :(得分:0)

也许在每个页面上!IsPostBack或通过基页,您可以清空对与该页面无关的会话数据的所有引用。每次用户转到站点中的另一个页面时,这将“过期”数据。

如果用户离开站点或进入活动状态,那么在会话到期之前您无能为力,但在这种情况下,每个用户只能有一页会话数据。