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

  • 相关阅读:
    发现个atan2的正确使用方式
    Forward+ Shading架构
    fatal: unable to connect to gitee.com: gitee.com[0: 180.97.125.228]: errno=Unknown error 解决方案
    HDFS HA(高可用性)集群规划
    如何使用RTP引擎对语音编码进行转码
    关于 Angular 应用 tsconfig.json 中的 target 属性
    浅谈 Orbeon form builder 的权限控制
    关于 Angular 应用 tsconfig.json 中的 lib 属性
    orbeon form 通过 url 的方式同第三方应用集成的开发明细
    orbeon form 的配置介绍
  • 原文地址:https://www.cnblogs.com/zoro-zero/p/4587900.html
Copyright © 2011-2022 走看看