多个站点共享Session,并且Session设置过期时间

在工作中,遇见有多个站点需要共享Session值,找了好多相关的内容,要么就是看不太明白,要么就是太麻烦。后来终于是弄成了,先写下来,也许以后还用的着。

  开发使用语言:C#
  工具:VS2008简体中文版(英文版的被我换了,英文不太好......)
  数据库:SQL Server 2005
  运行平台:Windows Server 2003sp2 iis6.0

 


 

  当有多个站点需要共用Session值,前提条件是都归属于同一个顶级域名下,如:aaa.123.com与bbb.123.com或者更多。应该都有安装.net Framework 2.0或者以上版本吧?

   首先,要做的是在web.config添加如下配置:

<system.web><!-- 在system.web节点中添加下面的sessionState -->
<sessionState
  cookieless="false"
<!--这个cookieless如果设置为 true 则会在链接上自动添加sessionid 使用上与用户无关是iis自动添加的 -->
  regenerateExpiredSessionId="true" mode="SQLServer"  timeout="20"  <!-- 设置Session过期时间 -->
<!-- mode="SQLServer" 表示通过SQLServer会话模式创建Session(自己的理解) -->
sqlConnectionString="data source=127.0.0.1; uid=sa;password=">
<!-- sqlConnectionString这个就是链接数据库的字符串,建议数据库实例不使用SQLEXPRESS,后面会提到-->
    </sessionState>
</system.web>

还一种写法,安全性更高些:

<sessionState
  cookieless="true"  timeout="20"  <!-- 设置Session过期时间,分钟单位 -->
  regenerateExpiredSessionId="true" mode="SQLServer" sqlConnectionString="data source=.; Integrated Security=SSPI;"> <!-- SSPI 指的是使用Windows身份验证模式登录 -->
    </sessionState>

   接着,需要开启SQLServer的作业功能,如果使用到了SQLEXPRESS,则看不到SqlServer的作业功能的,也就是为什么我前面说不建议使用SQLEXPRESS作为实例,也就是说如果是本机测试,直接打一个“.”加用户名密码就能登录SQLServer的情况。关于怎样开启SQLServer作业,看《SQL Server 作业》,有详细说明。
现在登录SQLServer,如果没启动SQLServer的作业,先启动下,找到“InstallSqlState.sql”这个文件,位于“C:/WINDOWS/Microsoft.NET/Framework/v2.0.50727/”目录。
“v2.0.50727”是Framework的版本号,SQLServer2005使用的是.net Framework2.0的,所以只有2.0里面有这个文件:InstallSqlState.sql。
执行InstallSqlState.sql文件后会在数据库内创建一个AspState数据库,但是没有表,只是增加了许多存储过程。还有作业(这就是为什么要先开启作业功能并且不使用SQLExpress实例的原因,作业的功能就是1分钟检查一次Tempdb中的两个表,删除一些过期的Session值,要不Session值都会一直保存在数据库中的)。
在Tempdb中会增加两个临时表
ASPStateTempApplications
ASPStateTempSessions
在这可能会提示两个错误:

一个是:
消息 14261,级别 16,状态 1,过程 sp_add_category,第 26 行
指定的 @name ('[Uncategorized (Local)]')已存在。
这个不清楚什么用,错误了也没发现有什么异常的现象,所以不管它。
还一个是:
引起的可能是作业需要的一个服务没开启(SQL Server Agent) 需要在服务器和连接的外围应用配置器上面进行手动开启下,最好是直接设置成自动运行也就OK了。

  所有的准备工作也就算做好了,最好检查一下作业是否已经开始正确运行,如果没有,手动对作业进行配置一下再运行,保证SQL Server会话的正常允许。如果你有耐心,自己在iis里面建两个web站点 然后在C:/WINDOWS/system32/drivers/etc/hosts 这个文件(用记事本打开)
在“127.0.0.1       localhost”后面换行增加
127.0.0.1       aaa.123.com
127.0.0.1       bbb.123.com
(作用是模拟域名效果,Session共享需要处于同一个顶级域名以下才有用)
两个站点的web.config都要和刚刚开始提到的配置文件那样先配置一下才有效,并且站点有对Session值进行输出,还有,别忘记了做个互访链接哈,方便查看嘛,将站点的主机头配置为上面设置的aaa.123.com与bbb.123.com,打开站点,就会发现,Session的值已经共享了。测试结束了别忘记清除刚刚模拟域名效果弄的东东,要不浏览器万一以后访问不了这两个你设置的域名的真实网站,别找我……

  最后不能不说的一句话,微软很好很强大……

 

 


 

Asp.net中SqlServer模式Session的多站点共享会话状态

 


今天在为 Web 与 BBS站点间保持会话状态一致费了不小时间。

先记录下过:

1。修改配置文件

<system.web>
    <!-- 让其在跨站点访问时,使SESSION能共用 -->
    <httpCookies domain="CSDN.Net" />
    <!-- 设置Session模式为SQLServer -->
    <sessionState mode="SQLServer" sqlConnectionString="Data Source=127.0.0.1;User ID=ASPState;Password=ASPState;" timeout="60" />
</system.web>
2。修改 ASPState的TempGetAppID存储过程,让不同的站点保持同一个AppId。

因为实在找不到可以自定义AppName的方法,只有出此下策了。

/**//*

    获取AppId
   
    修改过程,使其只生成一个AppId

*/
CREATE PROCEDURE dbo.TempGetAppID
@appName    tAppName,
@appId      int OUTPUT
AS

SET @appName = LOWER(@appName)
SET @appId = NULL

--查询AppName对应的AppId
--次处进行了修改,使每个AppId都是一样.
SELECT top 1 @appId = AppId
FROM [tempdb].dbo.ASPStateTempApplications
--WHERE AppName = @appName

--如果没有查询到AppId
IF @appId IS NULL
BEGIN
    BEGIN TRAN
        --锁定模式查询
        SELECT @appId = AppId
        --SELECT top 1 @appId = AppId
        FROM [tempdb].dbo.ASPStateTempApplications WITH (TABLOCKX)
        WHERE AppName = @appName
       
        --如果没有查询到AppId
        IF @appId IS NULL
        BEGIN
            --获取AppName的HashCode
            EXEC GetHashCode @appName, @appId OUTPUT
           
            --插入新AppId
            INSERT [tempdb].dbo.ASPStateTempApplications
            VALUES
            (@appId, @appName)
           
            IF @@ERROR = 2627
            BEGIN
                DECLARE @dupApp tAppName
           
                SELECT @dupApp = RTRIM(AppName)
                FROM [tempdb].dbo.ASPStateTempApplications
                WHERE AppId = @appId
               
                RAISERROR('SQL session state fatal error: hash-code collision between applications ''%s'' and ''%s''. Please rename the 1st application to resolve the problem.',
                            18, 1, @appName, @dupApp)
            END
        END
    COMMIT
END

RETURN 0
GO

网上有很多方式,但都不是我的环境所需要的

1。修改站点的IIS元数据
     IIS站点有不同的Id(/LM/W3SVC/1009009583/Root,ID是1009009583,一般通常是1),此方法适合多服务器间的站点集群(同一台服务器上把站点ID修改为相同为出现站点错乱)。
     有关解决服务器之间应用程序路径不同的问题的步骤信息,请参见位于 http://support.microsoft.com/default.aspx?ln=zh-cn 上的 Microsoft 知识库中的文章 325056“PRB: Session State Is Lost in Web Farm If You Use SqlServer or StateServer Session Mode”(PRB:如果使用 SqlServer 或 StateServer 会话模式则会在网络场中丢失会话状态)。


2。使用虚拟目录
     把多个站点放到同一个站点中。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值