[ASP.NET]Session在多个站点之间共享解决方案
对于大多数的网站来说,都会使用Session来维护用户在一次会话中操作;Session对于任何Web项目来说都是必不可少的(当然除去那里网站里不包含任何用户操作的,^_^这个对于Web2.0时代的网站来说好像是不太可能的吧)。对于单独的站点来说,一个站点只用一个Session就OK了,但对于同时多个站点来说,如何对多个站点时实现Session共享呢?
常见的作法有:
- 使用Cookie方式实现多个站点间的共享(这种方式只限于几个站点都在同一域名的情况下);
- 使用.net自动的状态服务(Asp.net State Service);
- 使用.net的Session数据库;
- 使用MemcachedDB。
以上几种方案各有优点,至于每种方式的优点在那里,缺点在那里?一时半会真的很难说清,如果有一篇文章就能说清的,那都是扯蛋,这种东西没有在实际中使用,单单在表现上说这个方案好那个方案不好,都是扯蛋。
我们的项目现在采用的是第三种方案,使用Session数据库解决多站点的Session共享。有不同看法的朋友都可以聊一下,下面说一下我们的实现方式:
- 既然使用Session数据库了,当然必须要先对数据库进行创建,既然是使用微软的方案了,微软肯定也就为大家提供了相应的实现方式。通过命令行方式进入:
1 C:\Windows\Microsoft.NET\Framework64\v4.0.30319
1 aspnet_regsql.exe -sstype c -ssadd -d 你的数据库名 -U 用户名 -P 密码 -S 数据库服务地址
- Session数据库创建成功了并不代表就可以实现多项目的Session共享了,还需要对目前的Session数据库做一些小小的手脚,其实就是为了欺骗数据库说“哎,我就一个应用程序在运行。^_^”。下面来看看怎么做这点小手段:
1ALTERPROCEDURE[dbo].[TempGetAppID] 2@appName tAppName, 3@appIdint OUTPUT 4AS 5SET@appName=LOWER(@appName) 6SET@appId=NULL 7 8SELECTtop1@appId= AppId 9FROM[SNSSessionDB].dbo.ASPStateTempApplications 10--WHERE AppName = @appName11 12IF@appIdISNULLBEGIN 13BEGINTRAN 14 15SELECT@appId= AppId 16FROM[SNSSessionDB].dbo.ASPStateTempApplications WITH (TABLOCKX) 17WHERE AppName =@appName 18 19IF@appIdISNULL 20BEGIN 21EXEC GetHashCode @appName, @appId OUTPUT 22 23INSERT[SNSSessionDB].dbo.ASPStateTempApplications 24VALUES 25 (@appId, @appName) 26 27IF@@ERROR=2627 28BEGIN 29DECLARE@dupApp tAppName 30 31SELECT@dupApp=RTRIM(AppName) 32FROM[SNSSessionDB].dbo.ASPStateTempApplications 33WHERE AppId =@appId 34 35RAISERROR('SQL session state fatal error: hash-code collision between applications ''%s'' and ''%s''. Please rename the 1st application to resolve the problem.', 3618, 1, @appName, @dupApp) 37END 38END 39 40COMMIT 41END 42 43RETURN0
上面的各种手段都做了,其实目的只有一个就是在项目中使用这个Session数据库(发点牢骚:说微软坑爹吧,其实一点都不假,他啥都替你想到了,我们这只简单的会使用他就行了,这也是一代一代.NET开发人员的悲剧,每次微软发生新的技术改动,我们这些苦逼的开发人员就要去学习学习,然后微软突然那天说我不对这个技术再做升级了,我要放弃他了,好了你就看吧,大街上一个个苦着脸的,有一半都是搞开发的。)。怎么在项目中使用他呢?修改 web.config 在system.web 加入或修改以下项
1 <httpCookies domain="news.com" /> 2 <sessionState mode="SQLServer" sqlConnectionString="data source=[Server];initial catalog=[DataBase];user id=[UserName];password=[Password]" allowCustomSqlDatabase="true" timeout="120"/>
4. OK,你大功告成了.记得重启一下IIS ,最好把自己本机上的cookie或垃圾项清除一下,这样效果更好。
通过上面的一系列操作,终于OK了,在项目中使用的时候,就像我们平常一样赋值和调用就OK了。
OK了,终于写完了。