首页 > Web开发 > 详细

asp.net 子应用程序/虚拟目录 session共享

时间:2015-12-03 21:09:15      阅读:355      评论:0      收藏:0      [点我收藏+]

最近遇到了一个问题,我做的asp.net mvc应用程序要作为一个子应用程序部署到几个站点中,需要在本应用程序中获取站点的session值。

已经使用了session state server,并设置了machine key,但还是不行。

这个问题折腾了整整一天的时间。网上有很多人遇到了这个问题,也有很多解决方案,但大都不能用。最后在某个英文站点中找到了解决的方法。

现将解决方法整理之后贴出来。

1.建立一个HttpModule

 /// <summary>
    /// 这个模块需要放到整个管道的前端
    /// </summary>
    public class SessionShareModule : IHttpModule
    {

        void IHttpModule.Init(HttpApplication context)
        {
            Type storeProvider = typeof(HttpSessionState).Assembly.GetType("System.Web.SessionState.OutOfProcSessionStateStore");

            FieldInfo uriField = storeProvider.GetField("s_uribase", BindingFlags.Static | BindingFlags.NonPublic);

            if (uriField == null)
            {
                throw new ArgumentException("UriField was not found");
            }

            uriField.SetValue(null, "xxx.cn");

            context.EndRequest += new EventHandler(this.EndRequest);
        }



        /// <summary>
        /// 在请求结束之后,将所有的cookie的域都改写为 xxx.cn
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="args"></param>
        void EndRequest(object sender, EventArgs args)
        {
            HttpApplication application = sender as HttpApplication;

            for (int i = 0; i < application.Response.Cookies.Count; i++)
            {
                application.Response.Cookies[i].Domain = "xxx.cn";
            }
        }



        void IHttpModule.Dispose()
        {

        }
    }

模块部署

(1)将这个模块的dll文件复制到站点和子应用程序的bin目录下

(2)在站点的web.config的  <system.webServer> <modules>节下添加配置:

   <add name="SessionShare" type="XXX.SessionShare.SessionShareModule, XXX.SessionShare" />

子应用程序的web.config配置项可加可不加。不加的话,它会继承站点的配置项。加的话,它会覆盖站点的配置项。建议不用加。

 

asp.net 子应用程序/虚拟目录 session共享

原文:http://www.cnblogs.com/dehai/p/5017404.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!