国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

ASP.NET二級域名站點共享Session狀態

2019-11-17 04:11:01
字體:
來源:轉載
供稿:網友

asp.net二級域名站點共享session狀態
我的前面一篇文章提到了如何在使用了ASP.NET form authentication的二級站點之間共享登陸狀態,http://www.survivalescaperooms.com/jzywh/archive/2007/09/23/902905.html

今天, 我要寫的是如何在二級域名站點之間,主站點和二級域名站點之間共享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 

 validationKey="78AE3850338BFADCE59D8DDF58C9E4518E7510149C46142D7AAD7F1AD49D95D4" 

 decryptionKey="5FC88DFC24EA123C"

 validation="SHA1"/>

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共享問題。

本文來自CSDN博客,轉載請標明出處:http://blog.csdn.net/nutian/archive/2008/11/08/3254149.aspx


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 浠水县| 玉树县| 来安县| 循化| 顺昌县| 铁岭市| 尖扎县| 逊克县| 四川省| 和龙市| 沛县| 郯城县| 永寿县| 上林县| 田东县| 吉安市| 左云县| 昭通市| 池州市| 集安市| 巴青县| 马山县| 华亭县| 平阳县| 临泽县| 沙湾县| 阿巴嘎旗| 库伦旗| 郸城县| 宜都市| 章丘市| 新巴尔虎左旗| 株洲县| 高安市| 奇台县| 察雅县| 城步| 木兰县| 潍坊市| 桃源县| 南昌市|