zoukankan      html  css  js  c++  java
  • ASP.NET状态管理

    ASP.NET状态管理
    web本质是是无状态的,对页面的每个请求都将被视为新请求,而且默认情况下,来自一个请求的信息对下一个请求不可用。
    为了帮助克服此基于web的应用程序的固有限制,asp.net包含许多用于管理状态(即用于存储请求之间的信息)的功能。

    ViewState
        在asp时代,大家都知道一个html控件的值,如input控件的值,当我们把表单提交到服务器后,页面再刷新回来的时候,
        input里面的数据已经被清空,这是因为web的无状态性导致的,服务端每次把html输出到客户端后就不再于客户端有联系。
        asp.net巧妙的改变了这一点,当我们在写一个asp.net表单时,一旦标明了 form runat=server,那么,asp.net就会自动在输出时给页面添加一个隐藏域。
        <input type="hidden" name="__VIEWSTATE" value="">
        那么,有了这个隐藏域,页面里其他所用的控件的状态,包括页面本身的一些状态都会保存到这个控件值里面,
        每次页面提交是一起提交到后台,asp.net对其中的的值进行解码,然后输出时再根据这个值来回飞各个控件的状态。
        我们再看这个控件的value值。。。。。
        我们把iewState和session做下对比,session的值是保存在服务器内存是,那么,可以肯定,大龄的使用
        session将导致服务器负担加重。而viewState由于只是将数据存入到页面隐藏控件里,不在占用服务器资源,
        因此,我笨可以将一些需要服务器“记住”的变量和对象保存到viewstate里面。而session则只应该用于
        在需要跨也没且与每个访问用户香港的变量和对象存储上。另外,session在默认情况下20分钟就过期,而viewstate则永远不会过期。
        但viewstate并不是能存储所有的。net数据类型,他仅仅支持string,integer,boolean,array,arraylist,hashtable以及自定义的类型。
       
        当然,任何事务都有两面性,使用viewstate会增加页面html的输出量,占用更多的带宽,这一点是需要我们慎重考虑的。
        另外,由于所有的viewstate都是存储在一个隐藏域里面,用户可以很容易的通过查看源码来看到这个经过base64编码的值。
        然后在经过转换就可以获取你存储其中的对象和变量。
       
        其实,对应viewstate的安全性问题,asp.net还给我们提供了更多的选择。一般如果要包含viewstate有两种方式,
        一种是防篡改,一种是加密,一说到防篡改,我们就想起来使用散列代码,没错,我们可以在页面党内干部加入如下代码:
        page EnableViewStateMAC=true
        这样,asp.net就会自动的在viewstate中追加一个散列码,在页面回传时,服务器根据回传的viewstate生成一个散列码,
        在于回传的散列么比较,如果不对,则丢弃该viewstate,同时控件将回复初始状态(默认情况下asp.net是同伙SHA1算法而不是MD5算法来生成散列,不过这个可以在machine.config里面配置 machinekey validation=“MD5”即可)
        而viewstate加密就更简单了,只奥在machine.config里面设置一下 machineKey validation="3DES"即可实现用des加密viewstate了。
        原文:http://www.cnblogs.com/yzxchoice/archive/2006/09/08/498499.html
     
    ASP.NET 状态管理概述:
        每次将网页发送到服务器时,都会创建网页类的一个新实例。在传统的web编程中,这通常意味着
        在每一次的往返行程中,与该页及该页上的控件关联的所有信息都会丢失。
        为了解决传统的web变成的固有限制,asp.net包括了几个选项,可版主您俺页保留数据和整个应用程序范围内保留数据。如下所示:
        1.视图状态
        2.控件状态
        3.隐藏域
        4.Cookie
        5.查询字符串
        6.应用程序状态
        7.会话状态
        8.配置文件属性
        视图状态、控件状态、隐藏域、Cookie和查询字符串均会涉及以不同方式将数据存储到客户端上,而应用程序状态、会话状态和配置文件属性豆浆数据存储到服务器上的内存中。
        没个选项都有不同的有点和缺点,具体取决于相应的方案。
       
        基于客户端的状态管理选项
        1.视图状态
        viewstate属性提供一个字典对象,用于在对同一页的多个请求之间保留值。这是页用来在往返想成之间保留页和控件属性值的默认方法。
        在处理页时,页和控件的当前状态会散列为一个字符串,并在页中保存为一个隐藏域或多个隐藏域(如果存储在viewstate属性中的数量超过了MAXPAGESTATEFIELDLENGTH属性中的指定值)。
        当将页回复到服务器时,页会在页初始化解答分校视图状态字符串,并还原页中的属性信息。
        2.控件状态
        有时,为了让控件正常工作,您需要按顺序存储控件状态数据。例如,如果编写了一个自定义控件,其中使用了不同的选项卡来显示不同的信息。
        为了让自定义控件按预期的方式工作,该控件需要知道在往返行程直接选择了哪个选项卡。可以使用viewstate属性来实现这一目的,
        不过,开发人员可以在页级别关闭视图状态,从而是控件无法正常工作。为了解决此问题,asp.net页框架在asp.net中公开了一项名为控件状态的的功能。
      ControlState 属性允许您保持特定于某个控件的属性信息,且不能像 ViewState 属性那样被关闭
        3.隐藏域
        asp.net运行您将信息存储在HiddenField控件中,次控件将呈现为一个标准的hmtl隐藏域。隐藏域在浏览器中不以任何可见的形式呈现,但您可以就象对待标准控件一样设置其属性。
        当想服务器提交页时,隐藏域的内容将在http窗体集合中随同其他控件的值一起发送。
        隐藏域可用作一个储存库,您可以将希望直接存储在页面中的任何特定于页的信息防止其中。
        HiddenField控件在其value属性中只存储一个变量,并且必须通过显示方式添加到页上。
        为了在页处理期间能够使用隐藏域的值,必须使用http post 命令提交相应的页。如果在您使用隐藏域的同时,
        为了响应某个连接或者http get 命令而对页进行了相应处理,那么隐藏域将不可用。
        4.Cookie
        Cookie是一些少量的数据,这些数据或存储在客户端文件系统的的文本文件中,或者存储在客户端浏览器会话的内存中。
        Cookie包含特定于站点的信息,这些信息是随页输出一起有服务器发送到客户端的。
        Cookie可以是临时的(具有特定的过期时间和日期),也可以是永久的。
        可以使用Cookie来存储有关特定客户端、会话或者应用程序的信息。Cookie保存在客户端设备上,当浏览器请求某页时,
        客户端会将Cookie中的信息连同请求一起发送。服务器可读取Cookie并提取他的值。一项常见的用途是存储标记(可能已加密),
        一直是该用户已经在您的应用程序中进行了身份验证。
       
        安全注意

        浏览器只能将数据发送回最初创建该 Cookie 的服务器。但是,恶意用户可通过多种方法访问 Cookie 并读取其中的内容。建议您不要将敏感信息(如用户名或密码)存储在 Cookie 中。
        您可以在 Cookie 中存储一个标识用户的标记,然后使用该标记在服务器上查找敏感信息。
        5.查询字符串
        ………………………………………………………………………………
        基于服务器的状态管理选项
        1.应用程序状态
        asp.net允许您使用应用程序状态来保存每个活动的web应用程序的值,应用程序状态是HttpApplicationState类的一个实例。
        应用程序状态是一种全局机制,可以从web应用程序中的所有页面访问。因此,应用程序状态可用于存储需要在服务器往返行程之间及页请求之间维护的信息
        应用程序状态存储在一个键/值字典中,在每次请求一个特定的URL期间就会创建这样一个字典。
        可以将特定于应用程序的信息添加到次结构以在页请求期间存储它。
        一旦将应用程序特定的信息添加到应用程序状态中,服务器就会管理该对象。
        2.会话状态
        asp.net允许您使用会话状态保存每个活动的web应用程序会话的值,会话状态是HttpSessionState类的一个实例。
        会话状态与应用程序状态相似,不同的只是会话状态的范围限于当前的浏览器会话。如果有不同的用户在使用您的应用程序,则每个用户会话都将有一个不同的会话状态。
        此外,如果同一用户在退出后又返回到应用程序,第二个用户会话的会话状态也会与第一个不同。
        会话状态采用键/值字典形式的结构来存储特定于会话的信息,这些信息需要在服务器往返直接及页请求之间进行维护。
        可以使用会话状态来完成以下任务。
            1.唯一标识浏览器或者客户端的设备请求,并将这些请求映射到服务器上的单独会话实例。
            2.在服务器上存储特定于会话的数据,以用于同一个会话内的多个浏览器或者客户端请求。
            3.引发适当的会话管理时间。此外,可以利用这些时间编写应用程序代码。
        一旦将应用程序特定的信息添加到会话状态中,服务器就会管理该对象。
        根据您指定的选项的不同,可以将会话信息存储在Cookie中、进程外服务器中或运行Microsoft Sql Server的计算机中。
        配置文件属性
        3.配置文件属性
        ASP.NET 提供了一个称为配置文件属性的功能,可让您存储特定于用户的数据。此功能与会话状态类似,不同的是,在用户的会话过期时,配置文件数据不会丢失。配置文件属性功能使用 ASP.NET 配置文件,此配置文件以持久的格式存储,并与某个用户关联。
        ASP.NET 配置文件可让您轻松地管理用户信息,而无需创建和维护自己的数据库。此外,配置文件使用了一个强类型 API,您可以在应用程序中的任何位置访问该 API,从而使用用户信息。您可以在配置文件中存储任何类型的对象。
        ASP.NET 配置文件功能提供了一个通用存储系统,使您能够定义和维护几乎任何类型的数据,同时仍可用类型安全的方式使用数据。
        若要使用配置文件属性,必须对配置文件提供程序进行配置。
        ASP.NET 包括一个 SqlProfileProvider 类,使您能够将配置文件数据存储到 SQL 数据库中,但您也可以创建自己的配置文件提供程序类,用于以自定义格式将配置文件数据存储到自定义存储机制,如 XML 文件或 Web 服务
        因为放置在配置文件属性中的数据没有存储到应用程序内存中,所以这些数据在 Internet 信息服务 (IIS) 重新启动或辅助进程重新启动后仍能得到保留,而不会丢失。此外,配置文件属性可以跨多个进程得到保持,例如在网络场或网络园中。
        参考msdn
       
  • 相关阅读:
    js中的回调函数的理解和使用方法
    js循环的总结
    jquery选择器
    Jquery的命名冲突
    ul+li标签制作表格
    MyEclipse代码提示功能和自动提示功能
    a configuration error occured during startup.please verify the preference field with the prompt:
    MyEclipse2014,java文件无法编译,run as上是none applicable,不是文件本身的问题
    Myeclipse自定义注释
    Run As none applicable
  • 原文地址:https://www.cnblogs.com/wz327/p/2050336.html
Copyright © 2011-2022 走看看