在ASP.NET的程序中要使用Session对象时,必须确保页面的@page指令中EnableSessionState属性是True或者Readonly,并且在web.config文件中正确的设置了SessionState属性。

  ASP.NET中Session的状态保持是由web.config文件中的标记下的标记的mode属性来决定的。该属性有四种可能的值:Off、Inproc、StateServer和SQlServer。

  设为Off会禁用Session。

  Inproc是缺省的设置,这种模式和以前的ASP的会话状态的方法是类似的,会话的状态会被保存在ASP.NET进程中,它的优点是显而易见的:性能。进程内的数据访问自然会比夸进程的访问快。然而,这种方法Session的状态依赖于ASP.NET进程,当IIS进程崩溃或者正常重起启时,保存在进程中的状态将丢失。

  为了克服Inproc模式的缺点,ASP.NET提供了两种进程外保持会话状态的方法。

  ASP.NET首先提供了提供了一个Windows服务:ASPState,这个服务启动后,ASP.NET应用程序可以将mode属性设置为“SateServer”,来使用这个Windows服务提供的状态管理方法。

  除了在web.config文件中设置mode属性为StateServer外,还必须设置运行StateServer服务器的IP地址和端口号.

1、如果在IIS所在的机器运行StateServer则IP地址就是127.0.0.1,端口号通常是42424.配置如下:

  mode=”StateServer”

  stateConnectionString="tcpip=127.0.0.1:42424"

2、找一台服务器作为Session服务器(如IP为:192.168.1.244),启动其Windows中的ASP.NET State Service(默认的端口号为42424),把启动类型改为自动;
3、 修改Session服务器注册表中的项HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services \aspnet_state\Parameters中的AllowRemoteConnection 键的值为1,其中的Port键控制ASP.NET State Service的监听端口;修改后需要重启ASP.NET State Service才生效;

4、每台服务器的web。config 的  stateConnectionString都指向这台服务器

  使用这种模式,会话状态的存储将不依赖IIS进程的失败或者重启,会话的状态将存储在StateServer进程的内存空间中。

  另一种会话状态模式是SQLServer模式。这种模式是将会话的状态保存在SQL Server数据库中的。使用这种模式前,必须至少有一台SQL Server服务器,并在服务器中建立需要的表和存储过程。.NET SDK提供了两个脚本来简化这个工作:InstallSqlState.sql和UnInstallSqlState.sql。这两国文件存放在下面路径中:

  WinntMicrosoft.NETFramework

  要配置SQL Server服务器,可以在命令行中运行SQL Server提供的命令行工具osql.exe

  osql -s [server name] -u [user] -p [password]

  例如:

  osql -s (local) -u as -p “”-i InstallSqlState.sql

  做好必要的数据库准备工作后,将web.config文件中的sessionstate元素的mode属性改为”sqlserver”,并指定SQL连接字符串。具体如下:

  mode="SQLServer"

  sqlConnectionString="data source=127.0.0.1;userid=sa;password=;Trusted_Connection=yes"

  使用SQLServer模式处了可以使Session的状态不依赖于IIS服务器之外,还可以利用SQL Server的集群,使状态存储不依赖于单个的SQL Server,这样就可以为应用程序提供极大的可靠性。

 

关于ASP.NET中的负载均衡

ASP.NET站点中做负载均衡:
基于HTTP协议我们可能发现我们要解决两点问题:
第一,做到负载均衡,我们需要一个负载均衡器。
可以通过DNS轮询来做,在DNS服务器上配置为每次对我们做负载均衡的同一主机名的DNS查询得到不同的IP地址。这样的好处是配置简单投入较小,缺点是浏览器访问各个服务器的机会是均等的,不能根据服务器的负载程度自动把请求路由到负载较小的服务器。
可以通过专用的负载均衡设备,通过监测后台数台服务器的负载情况,自动把HTTP请求转发到负载较轻的服务器。另外必须监测后台服务器的IIS负载情况,而不是整台服务器的CPU负载。同时可能需要在负载均衡器和后台服务应用之间建立心跳连接,以避免出现某台服务器IIS进程或者其中跑的应用已经down掉,负载均衡器反而监测到这台服务器的负载最小而把大量请求转发的这台服务器,达到相反的效果。
第二,Session状态的保持和迁移。
    由于HTTP协议的无状态性,我们一般是在Session中保存客户端的一些状态数据,负载均衡之后,前后两次HTTP请求所到达的服务器可能不是同一台,这就造成可能出现这样的情况,前一此请求处理中设置的session在第二次请求中变得不可用了,造成应用程序出错。所以我们要把session跟随迁移。实现的方法就是session的统一存储和服务器间共享。
    在ASP.NET中服务器保存session有五种方式,Off不说了,InProc是保存在服务器进程的内存中,显然不能满足要求。另外两种能够满足:
StateServer是把session保存在专门的状态服务器中。这样各台服务器都存取同一个StateServer,达到共享的目的。
SQLServer是把session保存在数据库中。同样能达到目的。
Custom自定制的存储方案,我们自己写当然能够实现。
比较一下,Custom这种自己实现比较麻烦一般不用,SQLServer可以利用数据库的cluster达到高性能和高可用性的目的,StateServer当然也可以通过手段达到高可用性,不过似乎不能实现集群所以性能也有所限制。
另外如果要做负载均衡在StateServer和SQLServer中配置session时,必须在web.config中重写machineKey节点:
        <machineKey 
          validationKey="1234567890123456789012345678901234567890AAAAAAAAAA"
          decryptionKey="123456789012345678901234567890123456789012345678"
          validation="SHA1"
          decryption="Auto"
        />
否则各个应用服务器拿到的session还是不一样的。
可能Custom方式可以自己定义存取session方式忽略machineKey,这可能就不必要了,因为没有做过,不多说。

负载均衡服务器session共享的解决方案的更多相关文章

  1. 负载均衡服务器session共享的解决方案 (转载)

    http://luanzhz.blog.163.com/blog/static/58023129201101811445262/ 在ASP.NET的程序中要使用Session对象时,必须确保页面的@p ...

  2. nginx+tomcat+redis负载均衡及session共享

    概述 本文档是用来详细描述 nginx+tomcat+redis负载均衡实现session共享 所需软件及下载地址 软件名称 下载地址 功能说明 Nginx-v1.6.0 http://nginx.o ...

  3. haproxy+tomcat实现负载均衡以及session共享(linux centos7环境)

    一.安装HAProxy 1.进入home目录,下载最新haproxy安装包. cd /home wget http://haproxy.1wt.eu/download/1.4/src/haproxy- ...

  4. keepalived+nginx+tomcat+redis实现负载均衡和session共享(原创)

    keepalived+nginx+tomcat+redis实现负载均衡和session共享 直接上链接,码了一天,就不再重写了,希望能帮到大家,有问题欢迎留言交流.

  5. Nginx+Tomcat8+Memcached实现负载均衡及session共享

    1> 基础环境 简易拓扑图: 2> 部署Tomcat [root@node01 ~]# ll -h ~ |egrep 'jdk|tomcat'-rw-r--r-- 1 root root ...

  6. 玩转spring boot——负载均衡与session共享

     前言 当项目上线后,如果要修复bug或扩充功能,都需要重启tomcat服务.此时,正在使用应用的用户们就需要等待服务器的重启,而这就会造成不好的用户体验.还有,当仅仅只有一台tomcat服务时,如果 ...

  7. 集群服务器、负载均衡和session共享,C#的static变量

    集群服务器:是指由两台以上服务器共同组成的服务器,目的是为了提高性能. 负载均衡:是基于集群服务器实现的,作用是当A服务器访问数达到一定上限时,接下来客户端的请求会自动分配给B服务器,目的是减少服务器 ...

  8. 怎么样 解决nginx负载均衡的session共享问题呢

    php服务器有多台,用nginx做负载均衡,这样同一个IP访问同一个页面会被分配到不同的服务器上,如果session不同步的话,就会出现很多问题,比如说最常见的登录状态,下面提供了几种方式来解决ses ...

  9. LVS负载均衡下session共享的实现方式-持久化连接

    之前简单介绍LVS负载均衡的高可用方案实施,下面详细说明LVS的session解决方案: LVS算法中,SH算法可以实现将同一客户端的请求总是发送给第一次指定的RS,除非该RS出现故障不能再提供服务. ...

随机推荐

  1. Stable Matching 稳定匹配 婚姻算法 shapley 算法

    作者:jostree  转载请注明出处 http://www.cnblogs.com/jostree/p/4051286.html 稳定匹配问题:有N男N女,每个人对于异性都一个排名,先需要得到一种稳 ...

  2. yii2 model常用验证规则

    //字段必填[['username'],'required','message'=>'{attribute}不能为空!'][['username','password'], 'required' ...

  3. [旧博客]Python 第一次

    决定学习Python,发现其需要安装的东西很小,只需要在官方网站下载和15MB左右的安装包,Python for windows.安装完毕就双击IDE快捷方式就打开IDE了. 你很发现IDE好像很面熟 ...

  4. Java基础中的一些注意点

    1.在Java编程语言中,标识符是赋予变量.类或方法的名称.标识符可从一个字母.下划线(_)或美元符号($)开始,随后也可跟数字.标识符是大小写区别对待的并且未规定最大长度. 2.Java技术源程序采 ...

  5. 软件测试 -- alpha测试和beta测试的区别

    alpha测试是在用户组织模拟软件系统的运行环境下的一种验收测试,由用户或第三方测试公司进行的测试,模拟各类用户行为对即将面市的软件产品进行测试,试图发现并修改错误. Beta测试是用户公司组织各方面 ...

  6. Windows脚本

    最近项目测试比较麻烦,要启动好几个command窗口,手敲之类的有些繁琐,于是研究了一下windows脚本,实现以下功能: 懒人吗,参数意义顺序比较懒得记,所以需要友好参数提示: 根据参数数量决定启动 ...

  7. CODEVS 1132 瑞士轮

    题目描述 Description 背景 在双人对决的竞技性比赛,如乒乓球.羽毛球.国际象棋中,最常见的赛制是淘汰赛和循环赛.前者的特点是比赛场数少,每场都紧张刺激,但偶然性较高.后者的特点是较为公平, ...

  8. 关于Windows环境下安装Android模拟器Genymotion的教程

    打开Genymotion的官网www.genymotion.com,点击按钮"get genymotion", 选择"Free"下的"DOWNLOAD ...

  9. javascript和jquery动态创建html元素

    1.javascript创建元素 创建select var select = document.createElement("select");        elect.opti ...

  10. POJ2201+RMQ

    /* RMQ */ #include<stdio.h> #include<string.h> #include<stdlib.h> #include<algo ...