ASP.NET基础教程 控件编程 .NET设计模式 高级应用
返回首页

asp.net基于StateServer的二级域名共享session

时间:2015-05-14 17:03来源:www.cnblogs.com/liaohuolin/p/4 作者:admin 点击:我要投稿  高质量的ASP.NET空间,完美支持1.0/2.0/3.5/4.0/MVC等

 备注:亲自试验有效,如果网友有通过下面的教程未实现session共享的,欢迎留言说明你遇到的问题。必有回复。

最近为实现的二级域名共享session纠结好久。网上的很多实现的方法试了都不行,查了很久才找到了实现的方法。在这里记录下,以备以后所需。

二级域名共享session有多种实现方法:第一种依赖于cookie。第二种直接共享session。

我这里分享的是第二种直接共享session。session的存储方法有三种 InProc, StateServer, SQLServer。

这里分享的基于StateServer的存储方试。 

实现的思路:让主域名和二级域名的ASP.NET_SessionId 保持一致。

实现的步骤:

第1步.把sessionState的存储方式改为:StateServer,默认是InProc。 tcpip=127.0.0.1:42424  这段是指本机的意思。我试验的是主域名和二级域名都在都一台服务器上。如下图红色框框区域:

第2步.在system.web结点下添加结点 <httpCookies domain=".test.com"/> ,这里test.com改为你自己的域名。这个结点的功能就是实现ASP.NET_SessionId 保持一致。

查看ASP.NET_SessionId的方法可以用google浏览器打开网页,然后F12,如下面板查看ASP.NET_SessionId

第3步在Global.asax中添加如下代码。

复制代码
   public override void Init()     {         base.Init();         foreach (string moduleName in this.Modules)         {             string appName = "APPNAME";             IHttpModule module = this.Modules[moduleName];             SessionStateModule ssm = module as SessionStateModule;             if (ssm != null)             {                 System.Reflection.FieldInfo storeInfo = typeof(SessionStateModule).GetField("_store", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic);                 SessionStateStoreProviderBase store = (SessionStateStoreProviderBase)storeInfo.GetValue(ssm);                 if (store == null)//In IIS7 Integrated mode, module.Init() is called later
                {                     System.Reflection.FieldInfo runtimeInfo = typeof(HttpRuntime).GetField("_theRuntime", System.Reflection.BindingFlags.Static | System.Reflection.BindingFlags.NonPublic);                     HttpRuntime theRuntime = (HttpRuntime)runtimeInfo.GetValue(null);                     System.Reflection.FieldInfo appNameInfo = typeof(HttpRuntime).GetField("_appDomainAppId", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic);                     appNameInfo.SetValue(theRuntime, appName);                 }                 else                 {                     Type storeType = store.GetType();                     if (storeType.Name.Equals("OutOfProcSessionStateStore"))                     {                         System.Reflection.FieldInfo uribaseInfo = storeType.GetField("s_uribase", System.Reflection.BindingFlags.Static | System.Reflection.BindingFlags.NonPublic);                         uribaseInfo.SetValue(storeType, appName);                     }                 }             }         }     }
 

OK,主域名和二级域名都实现上面的三个步骤就可以了。

本站推荐文章:
本站热点文章:
顶一下
(0)
0%
踩一下
(0)
0%
------分隔线----------------------------
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色 情、暴力、反动的言论。
评价:
表情:
用户名:密码: 验证码:点击我更换图片