zoukankan      html  css  js  c++  java
  • ASP.NET MVC中的Session设置

    最近在ASP.NET MVC项目中碰到这样的情况:在一个controller中设置了Session,但在另一个controller的构造函数中无法获取该Session,会报"System.NullReferenceException"错误。之所以这样做是因为希望在controller构造函数中获取Session值并赋值给一个全局变量,好让该controller的多个action共享。


    起先以为是ASP.NET State Service服务没有开启,或者是Web.config中sessionState节点配置不对,结果都不是。最终发现:在ASP.NET中,Session只存在于action中,在controller构造函数中获取Session是行不通的。

    那么,ASP.NET Session到底是如何工作的?在ASP.NET MVC中action如何获取Session呢?

     为什么需要Session

    ASP.NET页面是"无状态"的,这意味着每次向服务器发送一个请求,服务器都会生成一个该页面的实例。但有时候,我们希望在不同的页面之间共享信息,比如购物车、用户登录等,于是,ASP.NET为我们提供了一个服务端的Session机制。

      Session是如何工作的

    服务端的Session机制是基于客户端的,也就是说服务端的Session会保存每个客户端的信息到服务端内存中。具体过程是这样的:
    →客户端向服务端发出请求
    →服务端响应客户端,并针对该客户端创建Session和唯一的Session ID
    →把Session ID作为key, Session内容作为value,以键值对形式存储到Session State Provider中
    →客户端带着专属的Session ID再次向服务端请求
    →服务端的Session机制根据客户端的Session ID,从Session State Provider中取出内容返回给客户端

    优点:
    ● 跨页面维持用户状态、信息
    ● 使用方便,并且能存储任何类型
    ● 能保存每个客户端的信息
    ● 安全的、透明的

    缺点:
    ● 因为Session是保存在服务端的内存中的,随着客户端请求的增多,很有可能影响到性能
    ● 在Web.conig中,sessionState节点的mode属性,如果设置为"StateServer"或"SQLServer",就必须为存储到Session中的对象打上[Serializable]。这样在存储、读取Session的时候,不断地序列化和反序列化,也会影响到性能

      Session的Mode

    在Web.config中,sessionState节点有一个mode属性,它的属性值代表了Session的Mode。包括:
    ● InProc
    ● StateServer
    ● SQLServer
    ● Custom
    ● Off

    每一种Mode的设置,会影响到Session机制采用哪种Session State Provider。

    □ Off

    如果我们想让Session失效:

    <system.web>
    
        <sessionState mode="off" />
    
    </sytem.web>

    □ InProc

    这也是ASP.NET Session机制所选用的默认Mode,在该模式下,只保存当前应用程序域的数据。如果重启服务器,Session保存的数据会全部丢失。

    <system.web>
    
        <sessionState mode="InProc" timeout="30" />
    
    </system.web>

    表示Session的有效期是30分钟。对于一些小网站或者数据量不大的时候,选用这个模式是比较好的。

    优点:
    ● 由于是把Session数据保存在内存中的,所以,获取数据非常快
    ● 没有序列化和反序列化的要求

    缺点:
    ● 如果应用程序域被丢弃、重启,Session数据会丢失
    ● 数据量大的时候,消耗过多的内存,影响性能

    □ StateServer

    选用此选项,意味着把Session的工作交给了当前应用程序域之外的asp.net_state.exe服务,这是一个独立于IIS之外的Windows服务。如果想启动该服务,可以通过打开“控制面板--管理工具--服务”,找到ASP.NET State Service这个服务,将其设为自动启动。

    即使重启ASP.NET进程,Session依然有效,这是StateServer模式的优点。此模式的缺点是涉及过多的序列化和反序列化。

    <system.web>
    
        <sessionState mode="StateServer" stateConnectionSting="tcpip=127.0.0.1:42424" stateNetworkTimeout="40" />
    
    </sytem.web>

    ● 127.0.0.1 表示默认选用本机
    ● 42424 表示默认端口
    ● stateNetworkTimeout用来设置服务器响应、等待客户端请求的时间,默认是10秒,这里设置为40秒

    如果想修改StateServer的默认设置,可以在asp.net_state.exe对应的注册表中修改。

    参考资料:

    http://www.cnblogs.com/ghd258/archive/2006/02/28/339443.html
    http://www.codeproject.com/Articles/32545/Exploring-Session-in-ASP-Net

  • 相关阅读:
    Papervision3D Essentials中文版,附Papervision3D_2.1.920.swc和章节练习源码
    谷歌Chrome浏览器上安装调试(debugger)版本的Flash Player
    Flash运行时错误代码解释说明
    XML
    Android手机与电脑互通
    mysql
    j2ee
    Linux
    C_obj
    maven
  • 原文地址:https://www.cnblogs.com/zoro-zero/p/4587900.html
Copyright © 2011-2022 走看看