今天在为 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 >
<!-- 让其在跨站点访问时,使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
获取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。使用虚拟目录
把多个站点放到同一个站点中。