欢迎光临
我们一直在努力

ASP.NET 的状态管理-.NET教程,Asp.Net开发

建站超值云服务器,限时71元/月

web form 网页是基于http的,它们没有状态, 这意味着它们不知道所有的请求是否来自
同一台客户端计算机,网页是受到了破坏,以及是否得到了刷新,这样就可能造成信息的
丢失。 于是, 状态管理就成了开发网络应用程序的一个实实在在的问题。
    在asp中能够通过cookie 、查询字符串、 应用程序、会话(session) 等轻易解决这些问题。
现在在asp.net环境中,我们依然可以使用这些功能,并且功能更加强大。
  状态管理分为服务端和客户端两种情况, 这里只是介绍 服务端状态管理:

   与application对象不同的是, asp.net 的session对象可以在iis服务器或者工作进程重新启动时
恢复启动前的状态而不丢失其中的数据。这是因为存储在session中的所以信息都缺省的存储在
一个作为windows服务运行的状态服务器进程中。状态可以被序列化并以二进制形式保存在内存中。
程序员可以悬着使用microsoft sql server数据库来存储数据。

 状态服务器服务和状态信息可以和web应用程序一起存在于同一台服务器上,也可以保存到外部的
状态服务器上。 为了指定如何存储信息,程序员可以在web.config文件中编写适当的配置。

  asp.net会话状态模块在web.config文件中<system.web>标记下的<sessionstate>标记的mode属性来决定
该属性的四种可能的值: off、 inproc stateserver 和sqlserver。
  
 1  inproc是缺省的设置
 
它允许“无cookie”的会话,以及在服务器之外存储
会话数据。asp.net会话状态模块在web.config文件中像下面这样配置:

<sessionstate mode=”inproc” cookieless=”false” timeout=”20″ />

在这个例子中,mode属性设为inproc(默认值),表明会话状态要由asp.net存储到内存中,而且
不用cookie来传递会话id。相反,会话id要直接插入一个网页url的查询字符串中。例如,采用
inproc模式并建立一个会话之后,调用一个假想的asp.net网页时,需要采用下面这样的url:

http://my.website.com/(12mfju55vgblubjlwsi4dgjq)/education.aspx

圆括号中长长的字母、数字字符串就是会话id。asp.net引擎从查询字符中提取会话id,并将用户
请求与特定会话联系起来。采取这种方式,不管cookie还是隐藏表单字段都用不着了。
所以,即使网页中没有使用表单,也能加入会话。

  但是这种方法,应用程序的状态将依赖于 asp.net进程, 当iis进程崩溃或者正常重启时,保存在
进程中的状态将丢失。

 2 mode属性设为off
 
   和从前的asp一样,asp.net的会话状态管理是要产生开销的。所以,假如某个网页不需要访问
session对象,开发者应将那个页的page预编译指令的enablesessionstate属性设为false。
要为整个网站禁用会话状态,可在web.config文件中将sessionstate元素的mode属性设为off。

   为了克服inproc 模式的缺点, asp.net 提供了两种进程外保存会话状态的方法。

 3 stateserver会话管理

  将mode属性设为stateserver,也就是将会话数据存储到单独的内存缓冲区中,再由单独一台机器上运行

的windows服务来控制这个缓冲区。状态服务全称是“asp.net state service ”(aspnet_state.exe),

它由web.config文件中的stateconnectionstring属性来配置。该属性指定了服务所在的服务器,以及要监

视的端口:
<sessionstate mode=”stateserver”
    stateconnectionstring=”tcpip=myserver:42424″
    cookieless=”false” timeout=”20″ />
  
 在这个例子中,状态服务在一台名为myserver的机器的42424端口(默认端口)运行。要在服务器上改变

端口,可编辑hklm\system\currentcontrolset\services\aspnet_state注册表项中的port值。
 
显然,使用状态服务的优点在于进程隔离,并可在web farm中共享。 使用这种模式,会话状态的存储将不

依赖于iis进程的失败或者重启,然而,一旦状态服务中止,所有会话数据都会丢失。换言之,状态服务不

像sql server那样能持久存储数据;它只是将数据存储在内存中。

 4  用sql server进行会话管理
 
   asp.net还允许将会话数据存储到一个数据库服务器中,方法是将mode属性变成sqlserver。
在这种情况下,asp.net尝试将会话数据存储到由sqlconnectionstring属性(其中包含数据源以及登录服

务器所需的安全凭证)指定的sql server中。
为了用恰当的数据库对象来配置sql erver,管理员还需要创建aspstate数据库,
方法是运行windir\microsoft.net\framework\version文件夹中的installstate.sql脚本(windir是服务

器的windows文件夹,而version是你使用的.net框架版本的安装文件夹)。
要配置sql服务器,可以在命令行中运行sql server 提供的命令行工具osql.exe

osql -s [ server name] -u [user] -p [password] <installsqlstate.sql
例如
osql -s (local)\netsdk -u sa -p “” -i installsqlstate.sql

  在这里用户名必须是sql服务器上的sa帐号,或者具有同等权限的其他帐号。有兴趣的读者可以打开
这个脚本文件来了解asp.net是如何和sql server配合实现状态管理的。
 
   卸载这些表和存储过程,可以使用uninstallsqlstate.sql脚本,使用方法与上面类似。

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

 mode=”sqlserver”
 sqlconnectionstring=”data source=127.0.0.1; userid=sa; password=”

配置好sql server后,应用程序代码运行时就和inproc模式没有什么区别。但要注意的是,由于数据不存

储在本地内存,所以存储会话状态的对象需要进行序列化和反序列化,以便通过网络传给数据库服务器,

以及从数据库服务器传回。这当然会影响性能。通过在数据库中存储会话状态,可分别针对扩展性及可靠

性来有效地平衡性能。另外,可以利用sql server的集群,使状态存储不依赖于单个的sql server, 这样就可以为应用程序提供极大限度的可靠性。

赞(0)
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com 特别注意:本站所有转载文章言论不代表本站观点! 本站所提供的图片等素材,版权归原作者所有,如需使用,请与原作者联系。未经允许不得转载:IDC资讯中心 » ASP.NET 的状态管理-.NET教程,Asp.Net开发
分享到: 更多 (0)