赏梅斋

关注微软技术

博客园 首页 新随笔 联系 订阅 管理

1. Asp.net的三种Session机制   

    在ASP.NET的程序中要使用Session对象时,必须确保页面的@page指令中EnableSessionState属性是True或者Readonly,并且在web.config文件中正确的设置了SessionState属性。

  ASP.NETSession的状态保持是由web.config文件中的标记下的标记的mode属性来决定的。该属性有四种可能的值:OffInprocStateServerSQlServer

  设为Off会禁用Session

  Inproc是缺省的设置,这种模式和以前的ASP的会话状态的方法是类似的,会话的状态会被保存在ASP.NET进程中,它的优点是显而易见的:性能。进程内的数据访问自然会比夸进程的访问快。然而,这种方法Session的状态依赖于ASP.NET进程,当IIS进程崩溃或者正常重起启时,保存在进程中的状态将丢失。

  为了克服Inproc模式的缺点,ASP.NET提供了两种进程外保持会话状态的方法。

  ASP.NET首先提供了提供了一个Windows服务:ASPState,这个服务启动后,ASP.NET应用程序可以将mode属性设置为“SateServer”,来使用这个Windows服务提供的状态管理方法。

  除了在web.config文件中设置mode属性为StateServer外,还必须设置运行StateServer服务器的IP地址和端口号.如果在IIS所在的机器运行StateServerIP地址就是127.0.0.1,端口号通常是42424.配置如下:

  mode=”StateServer”

  stateConnectionString="tcpip=127.0.0.1:42424"

  使用这种模式,会话状态的存储将不依赖IIS进程的失败或者重启,会话的状态将存储在StateServer进程的内存空间中。

  另一种会话状态模式是SQLServer模式。这种模式是将会话的状态保存在SQL Server数据库中的。使用这种模式前,必须至少有一台SQL Server服务器,并在服务器中建立需要的表和存储过程。.NET SDK提供了两个脚本来简化这个工作:InstallSqlState.sqlUnInstallSqlState.sql。这两国文件存放在下面路径中:

  WinntMicrosoft.NETFramework

  要配置SQL Server 服务器,可以在命令行中运行SQL Server提供的命令行工具osql.exe

  osql -s [server name] -u [user] -p [password]

  例如:

  osql -s (local) -u as -p “”-i InstallSqlState.sql

  做好必要的数据库准备工作后,将web.config文件中的sessionstate元素的mode属性改为”sqlserver”,并指定SQL连接字符串。具体如下:

  mode="SQLServer"

  sqlConnectionString="data source=127.0.0.1;userid=sa;password=;Trusted_Connection=yes"

  使用SQLServer模式处了可以使Session的状态不依赖于IIS服务器之外,还可以利用SQL Server的集群,使状态存储不依赖于单个的SQL Server,这样就可以为应用程序提供极大的可靠性。

 

2. 如何在SharePoint中使用Session

 

    很多开发人员喜欢在ASP.NET程序中使用Session,用它来记录当前登录用户的一些信息。但是在SharePoint 2010系统中,默认是禁用Session功能的。如果在一个应用程序中使用了Session,你很可能会发现代码会抛出一个“引用的对象没有实例化”异常。如果通过Visual Studio调试一下代码,就能发现HttpContext.Session属性返回的是null。

   

 

    要在一个SharePoint 2010程序中使用Session,开发人员会面临一些潜在的问题。SharePoint 2010系统很可能被部署为一个服务器场的模式,它可能包含有多台Web前端服务器,用户的Http请求会被NLB机制分发到多台Web前端服务器的任意一台上。这就要求开发人员应该尽可能的编写出“无状态”的代码,也就是说,代码不能依赖于某一台具体的服务器,因为开发人员没有办法确定自己的代码会始终运行在一个服务器上。有可能一个用户浏览一个页面时,它的请求被分配到Web服务器A,然后当用户刷新一下页面,这次请求则被分配到了Web服务器B。

在这样的服务器场模型中,代码在服务器的内存里面保存的任何数据,都会随着下次用户刷新后,处理用户请求的服务器转移,而变得没有意义。

SharePoint 2010由于某种原因,默认禁止在代码中使用Session。禁止的理由很可能是为了预防开发人员写出过于依赖Session的“有状态”代码,因为ASP.NET的Session默认是保存在服务器的内存中。一旦这些代码被部署到分布式服务器场环境中,它们就很可能由于依赖仅仅存储在某一台服务器内存中的Session数据而出错。

    ASP.NET的Session其实是可以配置成StateServer和SQLServer模式。StateServer模式是使用一台特定服务器上的一个Session State服务,来为服务器场中的所有服务器提供状态保存服务,SQLServer模式则是将所有状态信息保存到SQL Server数据库中。这两个模式都是能够很好的支持分布式服务器场模型的。

   

   所以,我们可以通过修改Web应用程序的web.config文件,手工启用Session。不过,SharePoint 2010其实已经内置了一个PowerShell指令,让我们轻松的在服务器场里面启用Session。这个指令就是Enable-SPSessionStateService。

  

 

   如上图所示,打开SharePoint 2010 Management Shell,输入如上指令,就可以在SharePoint配置数据库所在的SQL Server服务器上,自动创建一个名为“SharePoint_Session_State”的数据库,然后在所有Web应用程序的web.config中自动添加相应的条目。

 

   

    这个自动添加的条目,指明了Session将使用SQLServer模式以及存放Session的数据库连接字符串。打开SQL Server Management Studio,就能找到这个由Enable-SPSessionStateService自动创建的数据库,它仅包含2个Table。

   

Enable-SPSessionStateService还提供了几个其他的参数。-DefaultProvision参数表示将直接使用SharePoint系统现有的配置数据库(默认就是SharePoint_Config)作为存放Session数据的数据库,而不再使用专门的数据库(我非常不推荐这个做法)。-DatabaseServer和-DatabaseCredentials则可以指定使用自定义的数据库服务器(而不是默认的放置配置数据库的那个服务器)和数据库连接帐户。如果需要做一个反向操作,即在服务器场禁止Session的使用,可以使用Disable-SPSessionStateService指令。

 

posted on 2012-09-05 13:51  赏梅斋  阅读(540)  评论(0编辑  收藏  举报