实现多个ASP.NET跨程序池共享Session [转]
简要介绍,本文主要内容是实现通过ASP.NET自己的Sql Server的Session存储机制实现,通过存储过程实现忽略程序标识的区别,达到多程序池间Session数据共享的目的。详细原文:
本文转载人数己经太多,所以不知道原文地址何处,敬请谅解!
大致思路:
采用SqlServer方式存储Session,分析数据库表结构、原理、流程,大致可以得到SqlServer存储Session的方法:
表结构:

ASPStateTempApplications表存储应用程序Id及名称
ASPStateTempSessions表存储具体的Session值
不同的应用程序会在ASPStateTempApplications中注册不同的数据,从而在ASPStateTempSessions中有不同的Session,如果要实现Session共享,可以用欺骗SqlServer的方法:用某种方法使得不同的应用程序访问数据库时用相同的App!为了达到这个目的,分析[dbo].[TempGetAppID]这个存储过程,代码如下:
1 ALTER PROCEDURE [dbo].[TempGetAppID]2 @appName tAppName,3 @appId int OUTPUT4 AS5 SET @appName = LOWER(@appName)6 SET @appId = NULL7 ![]() 8 SELECT @appId = AppId9 FROM [Herald.Session].dbo.ASPStateTempApplications10 WHERE AppName = @appName11 ![]() 12 IF @appId IS NULL BEGIN13 BEGIN TRAN 14 ![]() 15 SELECT @appId = AppId16 FROM [Herald.Session].dbo.ASPStateTempApplications WITH (TABLOCKX)17 WHERE AppName = @appName18 19 IF @appId IS NULL20 BEGIN21 EXEC GetHashCode @appName, @appId OUTPUT22 23 INSERT [Herald.Session].dbo.ASPStateTempApplications24 VALUES25 (@appId, @appName)26 27 IF @@ERROR = 2627 28 BEGIN29 DECLARE @dupApp tAppName30 31 SELECT @dupApp = RTRIM(AppName)32 FROM [Herald.Session].dbo.ASPStateTempApplications 33 WHERE AppId = @appId34 35 RAISERROR("SQL session state fatal error: hash-code collision between applications ""%s"" and ""%s"". Please rename the 1st application to resolve the problem.", 36 18, 1, @appName, @dupApp)37 END38 END39 ![]() 40 COMMIT41 END42 ![]() 43 RETURN 0 |
可以看到传入参数是AppName,通过AppName获取AppId,如果不存在则在ASPStateTempApplications表中插入该条记录,这里AppName参数在传入时是不同的应用程序不同的,当然我们可以在这里小改一下...注意第5行SET @appName = LOWER(@appName) 我们可以毫不客气的改成SET @appName = "Everything
you want ^_^"
好了(不知道这样做微软会不会很不悦...),大功告成,清理残留的Session,最好重启一下IIS,不用修改旧程序本身丝毫(配置web.config除外),实现了Session共享...以后凡是使用该数据库作为Session存储的都可以共享Session了...
其他的一些配置说明如下:
配置web.config节:

