博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
.NET二级域名共享Session
阅读量:6715 次
发布时间:2019-06-25

本文共 2837 字,大约阅读时间需要 9 分钟。

ASP.NET二级域名站点共享Session状态  今天, 我要写的是如何在二级域名站点之间,主站点和二级域名站点之间共享Session。  首先, Session要共享,站点之间SessionID必须要一致,那怎么保证SessionID一致呢?  ASP.NET中的SessionID是存储在客户端的cookie之中键值为ASP.NET_SessionId用来维护浏览者Session对应关系的一个字符串,要想在二级域名站点之间,主站点和二级域名站点共享SessionID就必须先共享,那么我们就必须先实现ASP.NET_SessionId这一cookie的共享。  A: CrossDomainCookieModule  ------------------------------------------------------------------------------------------------  public class CrossDomainCookie : IHttpModule  {   private string m_RootDomain = string.Empty;   #region IHttpModule Members   public void Dispose()   {   }   public void Init(HttpApplication context)   {   m_RootDomain = ConfigurationManager.AppSettings["RootDomain"];   context.EndRequest += new System.EventHandler(context_EndRequest);   }   void context_EndRequest(object sender, System.EventArgs e)   {   HttpApplication app = sender as HttpApplication;   for (int i = 0; i < app.Context.Response.Cookies.Count; i++)   {   app.Context.Response.Cookies[i].Domain = m_RootDomain;   }   }   #endregion  }  上面的Module重设了所有cookie的domain到root domain, root domain在web.config中设置。也许有人会说这是眉毛胡子一把抓重写了所有cookie的domain, 那他也可以判断一下cookie的name, 如果为ASP.NET_SessionId的话才重写。  如果主站点和二级域名站点是同一站点,那么做到这一步,你的session就已经共享了,因为Session的ID是相同的,而且Session容器也是同一个。  如果主站点和二级域名站点是两个不同站点,则需要进行更多的操作了。  如果两个站点是不同的服务器的话,解决方法要简单点:  1) 使用相同的state server来存储Session.  2) 在两个站点的web.config设置相同的machineKey.  
  MachineKey的设置请参考http://msdn.microsoft.com/zh-cn/asp.net/w8h3skw9.aspx  3) 给两个站点设置相同name  这样做是为了确保两个站点的siteID相同,siteID是site name的hash值,注意请不要使用默认站点,因为默认站点的siteID并非site name的hash.  如果两个站点是在同一的服务器的话,需要对CrossDomainCookie再作一下修改,此方法也可应用于两个站点在不同服务器的情况:  1) 使用相同的state server来存储Session.  2) 用反射来设置System.Web.SessionState.OutOfProcSessionStateStore的静态字段s_uribase的值  public class CrossDomainCookie : IHttpModule   {   private string m_RootDomain = string.Empty;   #region IHttpModule Members   public void Dispose()   {   }   public void Init(HttpApplication context)   {   m_RootDomain = ConfigurationManager.AppSettings["RootDomain"];   Type stateServerSessionProvider = typeof(HttpSessionState).Assembly.GetType("System.Web.SessionState.OutOfProcSessionStateStore");   FieldInfo uriField = stateServerSessionProvider.GetField("s_uribase", BindingFlags.Static | BindingFlags.NonPublic);   if (uriField == null)   throw new ArgumentException("UriField was not found");   uriField.SetValue(null, m_RootDomain);   context.EndRequest += new System.EventHandler(context_EndRequest);   }   void context_EndRequest(object sender, System.EventArgs e)   {   HttpApplication app = sender as HttpApplication;   for (int i = 0; i < app.Context.Response.Cookies.Count; i++)   {   app.Context.Response.Cookies[i].Domain = m_RootDomain;   }   }   #endregion   }  完成这样的修改之后就可以实现Session的共享了。  同样如果你是使用SQL server来存储Session, 也可以使用类似的方法来解决Session共享问题。来源:Diy综合信息网.NET二级域名共享Session

 

转载地址:http://pnkmo.baihongyu.com/

你可能感兴趣的文章
Home Assistant系列 -- 自动语音播报天气
查看>>
Hyberledger-Fabric 1.00 RPC学习(1)
查看>>
SDNU 1450.报时助手
查看>>
BZOJ 4144 Dijkstra+Kruskal+倍增LCA
查看>>
阻塞与非阻塞,同步与异步
查看>>
HTML段落自动换行的样式设置
查看>>
Android实现左右滑动指引效果
查看>>
html里frame导航框架实现方法
查看>>
shell编程系列5--数学运算
查看>>
在 UWP 应用中创建、使用、调试 App Service (应用服务)
查看>>
Active MQ C#实现
查看>>
C#实现秒表程序
查看>>
cJSON 使用笔记
查看>>
CF1163E Magical Permutation
查看>>
BroadcastReceiver
查看>>
redis备份实操
查看>>
重要更新-Word 2003查找替换最后一个实例的第四种方法
查看>>
实现大屏幕全国监控各地流量和负载质量
查看>>
高性能HTTP加速器Varnish(安装配置篇)
查看>>
如何取消OneNote的粘贴来源地址
查看>>