ASP.NET实现多域名多网站共享Session值的方法

时间:2021-07-20 13:38:33

ASP.NET实现多域名多网站共享Session值 
1、实现功能:可设置哪些站点可以共享Session值,这样就防止别人利用这个去访问 
  要想实现这个功能就必须得把Session值 放入数据库中, 所有我们先在VS命令工具下注册一个 
命名如下:aspnet_regsql.exe -S [数据库服务地址] -E -ssadd 具体格式请参考 /? 
添加成功后我们休要对ASP.NET生成的存储过程进行简单的修改, 
打开ASP.net为我们创建的数据库“ASPState” 找到存储过程“TempGetAppID” 
然后修改存储过程如下: 

复制代码代码如下:


USE [ASPState] 
GO 
/****** Object: StoredProcedure [dbo].[TempGetAppID] Script Date: 11/21/2011 16:15:27 ******/ 
SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER OFF 
GO 
ALTER PROCEDURE [dbo].[TempGetAppID] 
@appName tAppName, 
@appId int OUTPUT 
AS 
SET @appName = LOWER(@appName) 
SET @appId = NULL 
set @appId=640732509 --这个是我自己测试时写死的 你可以通过系统数据库tempdb中的ASPStateTempApplications查询到站点appId 记住只有当网站的Seeion配置是数据库中 而且保存过一次Session值才能查询的到 
/* 
--SELECT @appId = AppId 
--FROM [tempdb].dbo.ASPStateTempApplications 
--WHERE AppName = @appName 
以上注释办法为原来ASP.net 自动生成的 
*/ 
IF @appId IS NULL BEGIN 
BEGIN TRAN 
SELECT @appId = AppId 
FROM [tempdb].dbo.ASPStateTempApplications WITH (TABLOCKX) 
WHERE AppName = @appName 
IF @appId IS NULL 
BEGIN 
EXEC GetHashCode @appName, @appId OUTPUT 
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 


这个就可以共享了,但我们还得解决一个问题就是替换客户端的SeeionID ,我们可以添加一个处理程序来利用SessionIDManager类来进行处理, 
实例我就不写了,我值写个替换的方法 

复制代码代码如下:


SessionIDManager sessionid = new SessionIDManager(); 
bool a; 
bool b; 
sessionid.SaveSessionID(this.Context, "这里是SeeionID", out a, out b); 


最后修改配置文件 
在System.Web节点下添加 <sessionState mode="SQLServer" sqlConnectionString="data source=数据连接;user id=sa; password=123456;" ></sessionState> 
ok 一切搞定 你去试试把