技术开发 频道

.NET会话管理


【IT168 技术文档】
    状态用于存储在当前会话中,当前用户的所有控件和变量的当前值。大家都知道,网络本身是一个无状态环境,这也就意味着每次页面提交给服务器,接着返回浏览器,该页面又重新被创建、加载,除非页面提交前已经保存了所有控件的状态,否则状态就会丢失,所有的控件就会根据默认的值重新创建。

    Asp.Net的强大功能之一就是能自动保持服务器控件的状态(包括其控件和Html)而无需用户编写任何代码,下面我就介绍下如何实现Asp.Net的状态管理。

    在Asp.Net中有四种状态类型:

<!--[if !supportLists]--> <!--[endif]-->控件状态

    该状态不能修改,只能直接访问或者被禁用。

<!--[if !supportLists]--><!--[endif]-->视图状态

    指页面及其所有控件的状态。试图状态子阿往返过程中由ASP.NET框架自动维护。当页面发送到服务器时,读取视图状态。在页面发送到浏览器时,会俯视图状态。视图状态存储在页面一个隐藏字段的状 态包中,状态被编码为一个字符串变量。由于状态通过标但字段来维护,因此这种技术适用于所有浏览 器。 

    如果无须维护页面视图状态,则可以通过禁用页面视图状态来提高性能。在Page指令中将 EnableViewState属性设置为false,可实现禁用页面视图状态。

    另一种方法是省略表单的服务器端标签(<form runat=”server”>),它也可避免维护视图状态,但是要注意这种做法会禁用所有服务器端的处理和控制。

    在Web.config配置文件<pages>节的EnableViewState属性为false,可以禁用整个应用程序的视图状态。或者将machine.config配置文件作同样的修改则可以禁用本机中所有应用程序的视图状态。

    而控件也可以维护或禁用某个控件的视图状态。我们可以通过设置Control.EnableViewState属性来实现。该属型为Boolean类型,默认值为true。同页面性质一样,禁用控件的视图状态也可提高性能。

    在这里要注意的是:视图状态只是针对字符串、整数、布尔值、数组、数组列表和哈希表进行优化。其他.NET数据类型可以在视图状态中被串行化和持久化,但是这会导致性能下降,产生巨大的视图状态字段。

    因此,在部分这种情况下,会话状态可能是一个更好的选择。另一方面,视图状态不消耗任何服务 器资源,也不会超时,而会话则会超时。

    在上面述说中我们涉及到一个状态包的概念。那什么是状态包?如果值没有和任何控件关联,而需要在交互过程中保留这些值,则可以把这些值保存在页面的状态宝中。状态宝时一个包含属性/值对的数据结构,与对象关联的数据以字符串形式存储。有效对象都是原始数据类型类型(如:整数、字节、字符串、布尔值等)。状态包使用StateBag类实现,它是一个(非类型安全)字典对象。可以如同操作任何字典对象一样,添加或者删除状态包中的项。

    状态包使用与视图状态同样的隐藏字段来维持。可通过ViewState关键字设置和获取状态包中内容的值。

<!--[if !supportLists]--><!--[endif]-->应用程序状态

    Web应用程序中包括所有的Web页面、组件、代码、文件和图片。这些内容都存储在虚拟目录或其子目录中。

    Global.asax文件包含Web应用程序的全局代码。Global.asax存储在应用程序虚拟根目录中。在 Global.asax文件中包括Application_Start、Application_End、Application_Error、Session_Start和 Session_End事件的处理程序。当应用程序收到第一个用户请求时,引发Application_Start事件。如果global.asax文件被编辑过并且保存了改动,那么当前所有等待的请求都将被完成,同时引发Application_End,然后将重启应用程序。这种顺序有效地重启应用程序,将写入所有的状态信息。而且应用程序的重启对所有用户是透明的,因为它只有在完成了所有的等待请求后,在接受新请求之前才发生。当接受了一个请求,应用程序再次重新开始时,则引发另一个Application_Start事件。

    利用字典对象可以实现信息在应用程序范围内的全局共享,每个对象都与一个关键字关联。这是通过HttpApplication类的内置属性Application实现的。Application属性克访问内容集合,而该机和的内容是通过代码直接添加到应用状态之中的。

<!--[if !supportLists]--><!--[endif]-->会话状态

    当我们连接到一个Asp.Net网站时,实际上就已经创建了一个会话。该会话为无状态的Web赋予了状态,使网站能识别来自同一启动会话的浏览器的后续页面请求。这可以保持页面状态,直到会话超时或此次会话结束为止。(注意:在Asp.Net中默认的超时时间是20分钟,超时时间可以设置)

0
相关文章