Asp.net 多服务器 Session共享
2012-11-06 18:12
197 查看
需求:
公司下派任务,之前的网站是一台服务器,由于用户过多,负载过大,现在老大要求多加一台服务器。加就加贝,应该跟我这DEV没有
关系吧,应该不会碰到Source的吧。但是,之前网站有一些数据是放在Session里面的。大家应该理解Sessino的机制(自己的理解):当用户访问服务器的时候,会在Cookie里面留下一个SessionId,HttpContext.Current.Request.Cookies["ASP.NET_SessionId"].Value就能取到,然后服务器会根据这个SessionId 来跟我服务器这边进行数据匹配,简单说就是拿你的SessionId来取存放在我服务器端的数据,类似于Key:Word。由于当一个客户端访问一个服务器,存放在Session的数据是在服务器端的,若是我加一台服务器的话,这Session的数据就要共享出来,能够让我两台机器同时访问到。这样,用户访问服务器的时候,我切换服务器机器就不会丢失Sesson里面的数据了。
步骤
在网上搜了关于Session 共享的方法,/article/5814694.html 有很多,我就选择一个SqlServer共享Sessin的方法。
1。
首先,你得建立这个Sqlserver数据库。cmd命令。C:\Windows\Microsoft.NET\Framework\v2.0.50727>aspnet_regsql.exe -S jpmsnmdb05t - E -d AWBUISession -ssadd -sstype c
命令不懂的看我文中的链接。很简单。
或者 运行C:\Windows\Microsoft.NET\Framework\v2.0.50727 里面的 InstallPersistSqlState.sql(建立数据库) UninstallPersistSqlState.sql(卸载)
2。
然后,在Asp.net 项目中的Web.config里面<system.web>输入
标签里面不懂也看链接
然后,在程序里面进行Sesssion["test"]="test value" 或则取Session的内容看看,ok,都会将Session的数据放到我建立的数据库里面。
注意
若是按照我上面的配置还没有成功的朋友,我只能说,你肯定犯错了,请见下面对照一下:
1. 写入Session的值一定要是可序列化的(我就碰到这个问题,把我搞死了,刚开始都不懂,看网上就说一句注意可序列化我也没有注意,真正自己配置不成功的时候就哭吧)我来举个例子,比如你新建了一个类User,当你Sesssion["User"]=new User("name","pwd"); 你要记住User类一定要序列化,不然你就永远不会成功,如何序列化,很简单在public class User上面添加一句话[Serializable()].记住所有的都要序列化,只要你向Session里面设值了,因为系统会把你写入Session 里面的值进行序列化后存放到ASPStateTempSessions表里面的。
2. 我自己配的测试环境,在/article/5814694.html 我还问了别人如何配置,当时我也不清楚我创建的测试环境是不是正确的。
我的配置环境(下面是我问别人的话) :
不知道楼主能不能看到,实在是没办法了,都纠结好久了。
我按照你的方式进行配置,我目的是想多台服务器共享session,利用Sql server。 我不知道我的测试方法对不对,我设置本地 host为 172.23.126.137 SessionTest # source server
10.168.109.120 SessionTest # x client host
我将我的代码放到这两台服务器上面,然后我停掉一台服务器IIS,然后访问 http://sessiontest:8078/ 比如用户登录功能,它会在SqlServer上面添加一条记录。 然后我打开这台,停掉另外一台,访问Url,它还是用户登录页面,按道理应该是检测用户信息成功,不会再次进行用户登录的。 两台服务器IIS都是,8078端口,只是IP不同。 希望楼主能看到,希望.......
虽然楼主回答了我的问题,然而还是没有看懂,但是还是非常感谢那位朋友,过了两三天,我自己还是发现问题的原因:
我要提到一个问题,ASPStateTempSessions表里面的SessionId其实是SessionId+AppId(占8位). AppId是ASPStateTempSessions表里面AppId的十六进制表示。我在网上看了好多资料,ASPStateTempSessions表里面的AppId到底是什么东西。无意中,我的测试人员提醒了我一下,我截个图 ,如下,看到26没有 。
我的ASPStateTempSessions表如下。
AppId APPName
-1977566844 /lm/w3svc/26/root
只要你在多个服务器里面把ID设为一样的就可以了。若是有不懂得可以问我,我最近在搞这个东西。
公司下派任务,之前的网站是一台服务器,由于用户过多,负载过大,现在老大要求多加一台服务器。加就加贝,应该跟我这DEV没有
关系吧,应该不会碰到Source的吧。但是,之前网站有一些数据是放在Session里面的。大家应该理解Sessino的机制(自己的理解):当用户访问服务器的时候,会在Cookie里面留下一个SessionId,HttpContext.Current.Request.Cookies["ASP.NET_SessionId"].Value就能取到,然后服务器会根据这个SessionId 来跟我服务器这边进行数据匹配,简单说就是拿你的SessionId来取存放在我服务器端的数据,类似于Key:Word。由于当一个客户端访问一个服务器,存放在Session的数据是在服务器端的,若是我加一台服务器的话,这Session的数据就要共享出来,能够让我两台机器同时访问到。这样,用户访问服务器的时候,我切换服务器机器就不会丢失Sesson里面的数据了。
步骤
在网上搜了关于Session 共享的方法,/article/5814694.html 有很多,我就选择一个SqlServer共享Sessin的方法。
1。
首先,你得建立这个Sqlserver数据库。cmd命令。C:\Windows\Microsoft.NET\Framework\v2.0.50727>aspnet_regsql.exe -S jpmsnmdb05t - E -d AWBUISession -ssadd -sstype c
命令不懂的看我文中的链接。很简单。
或者 运行C:\Windows\Microsoft.NET\Framework\v2.0.50727 里面的 InstallPersistSqlState.sql(建立数据库) UninstallPersistSqlState.sql(卸载)
2。
然后,在Asp.net 项目中的Web.config里面<system.web>输入
标签里面不懂也看链接
<machineKeyvalidationKey="1234567890123456789012345678901234567890AAAAAAAAAA"decryptionKey="123456789012345678901234567890123456789012345678"validation="SHA1"decryption="Auto"/> <sessionStatemode="SQLServer"sqlConnectionString="server=jpmsnmdb05t; database=AWBUISession;Trusted_Connection=Yes; Persist Security Info=False;"allowCustomSqlDatabase="true"cookieless="false"timeout="100"/>
然后,在程序里面进行Sesssion["test"]="test value" 或则取Session的内容看看,ok,都会将Session的数据放到我建立的数据库里面。
注意
若是按照我上面的配置还没有成功的朋友,我只能说,你肯定犯错了,请见下面对照一下:
1. 写入Session的值一定要是可序列化的(我就碰到这个问题,把我搞死了,刚开始都不懂,看网上就说一句注意可序列化我也没有注意,真正自己配置不成功的时候就哭吧)我来举个例子,比如你新建了一个类User,当你Sesssion["User"]=new User("name","pwd"); 你要记住User类一定要序列化,不然你就永远不会成功,如何序列化,很简单在public class User上面添加一句话[Serializable()].记住所有的都要序列化,只要你向Session里面设值了,因为系统会把你写入Session 里面的值进行序列化后存放到ASPStateTempSessions表里面的。
2. 我自己配的测试环境,在/article/5814694.html 我还问了别人如何配置,当时我也不清楚我创建的测试环境是不是正确的。
我的配置环境(下面是我问别人的话) :
不知道楼主能不能看到,实在是没办法了,都纠结好久了。
我按照你的方式进行配置,我目的是想多台服务器共享session,利用Sql server。 我不知道我的测试方法对不对,我设置本地 host为 172.23.126.137 SessionTest # source server
10.168.109.120 SessionTest # x client host
我将我的代码放到这两台服务器上面,然后我停掉一台服务器IIS,然后访问 http://sessiontest:8078/ 比如用户登录功能,它会在SqlServer上面添加一条记录。 然后我打开这台,停掉另外一台,访问Url,它还是用户登录页面,按道理应该是检测用户信息成功,不会再次进行用户登录的。 两台服务器IIS都是,8078端口,只是IP不同。 希望楼主能看到,希望.......
虽然楼主回答了我的问题,然而还是没有看懂,但是还是非常感谢那位朋友,过了两三天,我自己还是发现问题的原因:
我要提到一个问题,ASPStateTempSessions表里面的SessionId其实是SessionId+AppId(占8位). AppId是ASPStateTempSessions表里面AppId的十六进制表示。我在网上看了好多资料,ASPStateTempSessions表里面的AppId到底是什么东西。无意中,我的测试人员提醒了我一下,我截个图 ,如下,看到26没有 。
我的ASPStateTempSessions表如下。
AppId APPName
-1977566844 /lm/w3svc/26/root
只要你在多个服务器里面把ID设为一样的就可以了。若是有不懂得可以问我,我最近在搞这个东西。
相关文章推荐
- 如何在多台服务器上共享Session(PHP/JSP/ASP.NET)以及单点登录(SSO)
- 跨域名(跨服务器)共享SESSION ASP.NET 解决方案
- 跨域名(跨服务器)共享SESSION ASP.NET 解决方案
- Session 共享服务器 Asp.net SqlServer共享Session
- asp.net基于StateServer的二级域名共享session
- Asp.net中处理一个站点不同Web应用共享Session的问题
- 如何实现Asp与Asp.Net共享Session
- asp和asp.net共享session解决办法
- ASP.Net 多虚拟目录Web应用程序 实现Session共享
- asp和asp.net共享session解决办法
- 说说Asp.net的StateServer和Session共享
- 实现ASP.NET网站之间的单点登陆(跨域共享Session)
- asp.net session共享(通过StateServer方式)
- ASP.NET中在不同的子域中共享Session
- 如何实现Asp与Asp.Net共享Session
- 收集的资料共享出来(四)--[ASP.NET] Session 详解
- 利用WCF共享ASP.NET session实现WCF服务端验证
- 详解ASP.NET在不同的子域中共享Session
- ASP and ASP.NET的Session 如何共享
- asp和asp.net共享session解决办法