郭红俊
前一段时间被同一个站点的不同Web项目通用Session的问题苦恼,在CSDN网友的帮助下,找到了解决方法,网上也找到了一些相关文章。不过这些文章描述的并不够详细,我把这些相关知识整理一下,方便自己以后查找,也方便以后碰到这样问题的人,不要到处找资料,拼凑资料。
同一个站点,不同虚拟目录下的Web应用程序不能共享Session。而VS.net 默认创建的 Web 工程是一个工程一个虚拟目录,一个工程使用一套自己的Web.config和Global.asax文件,这样我们在开发一个站点的多个关联项目(通过Session共享资源)的时候,就会遇到麻烦。
解决这个问题并不难,把这些工程合并到一个虚拟目录下,至于Web.config和Global.asax,虽然一个工程可以配置一个,但是推荐还是整个web站点用一套配置,而且不同目录下的Web.config影响不同的目录下aspx的配置,如果根目录下和一个WEB应用程序目录下都有Web.config文件,而且都定义了,sessionState mode="InProc" 显然这两个应用的Session不可能共享了。
具体来说,满足以下条件,可以实现同一站点Session共享。
1、需要共享Session的站点去处虚拟目录设置,如下图:
(图一,删除应用程序的虚拟目录,注意是点击删除按钮,不是卸载按钮,把自己的应用程序目录文件删除了我可不负责)
2、保证整个站点有个Web应用程序必备的东西,比如Web.config和Global.asax。 这里的设置是要对整个站点负责的。简单的方法可以在站点的根目录创建一个Web应用。
3、删除各个需要通用Session站点目录下Web.config和Global.asax文件中影响该应用程序的设置,比如下面框中是罗里的Web.config中应该删除的。
<authentication mode="Windows" /> <sessionState mode="InProc" stateConnectionString="tcpip=127.0.0.1:42424" sqlConnectionString="data source=127.0.0.1;Trusted_Connection=yes" cookieless="false" timeout="20" />
满足以上条件就可以通用Session了。
下面针对对于团队开发中,使用vs.net开发站点不同项目通用Session写一个简单演示:
前提条件:
有两个Web 应用 WriteSession ,ReadSession 在同一个站点。我们要演示的是 WriteSession Web应用中写一个Session值,比如Session["aaa"] = "123"; 然后在ReadSession中读取出这个Session值。
上述两个工程就相当于大型Web开发中的分配给两个人的开发工程。可以这样认为,WriteSession 是处理用户登录,登录后登录信息记录到Session 然后其他Web工程 比如罗列用户信息在另外一个Web工程ReadSession
1、把两个Web工程包含在同一个解决方案中,比如:WebTest;(这个不用我图片演示了把,新建一个空白解决方案,然后把存在的两个Web工程加入这个解决方案)
2、新建一个Web工程,这个工程是整个站点的Web工程,不用包含这个站点下的几个Web工程,如果从解决方案浏览器下看如下图:
(图2 虽然 ReadSession WriterSession 下的aspx文件也属于ghj1976.csdn.net这个Web工程的一部分,但是它的工程下并没有罗列,这样实现了一个站点多个项目的功能,在稍后的配置中可以看到,ReadSession WriterSession 都被解除了虚拟目录。)
3、按照图一提供的方法,去除ReadSession 和 WriterSession 的虚拟目录配置。
4、ReadSession 和 WriteSession 两个Web工程的Web.Config文件中删除一些设置,删除那些看上面提到的框。(为了减少麻烦,最简单的方法是直接删除Web.Config和Global.asax 两个文件。这样以后程序启动就调用它上级的这两个配置文件,也就是ghj1976.csdn.net这个web应用的这两个文件)
5、在ghj1976.csdn.net web工程中增加对 ReadSession WriteSession 两个Web工程的引用,注意:是工程引用,不是其他引用 看下图
(图3 这三个Web工程是在同一个解决方案里面,这样才可以实现 工程引用)
图2也可以看到把这两个工程引用到ghj1976.csdn.net工程了。
6、生成解决方案,运行程序就看可看到,一切ok了。
如果要发布这个程序,执行文件只需要copy 根目录下bin目录下的文件就可以了。
其他要注意事项:
新建一个解决方案,这个解决方案只包含其中一个Web工程比如:ReadSession ,修改代码,生成解决方案,你会发现执行咋会不是自己修改后的呢。哈哈,当然不会一样了,这个工程已经不是虚拟目录了,他调用的执行文件是根目录下bin目录的文件,而不是这个解决方案目录下bin目录下的。
团队开发中,WriteSession 可以看作每个人都要调用的公共工程,ReadSession 可以认为是每个人自己负责的工程,这样就可以实现团队开发中的多个工程共享一个Session了。
如何团队开发网上这方面的文章很多,这里就不重复了。
相关资料连结:
CSDN 讨论这个问题的帖子在:
http://expert.csdn.net/Expert/topic/1773/1773115.xml
307467 HOW TO: Create an ASP.NET Application from Multiple Projects for Team
http://support.microsoft.com/?id=307467
How to Share Session/Application State Across Different ASP.NET Web Applications
http://www.asp101.com/articles/jayram/sharestate/default.asp
317786 HOW TO: Manage Multi-Project Solutions in Visual Studio .NET