ASP.NET 状态管理概览

页面每次被回传到服务器的时候都会创建 Web 页面类的一个新实例。在传统的 Web 开发中,这意味着在每次回传的过程中,页面中所有与页面和控件相关联的信息都将被丢失。例如,如果用户在一个文本框中输入了信息,那么在浏览器或者其他客户端设备与服务器的回传过程中,文本框中的信息将被丢失。

要克服 Web 开发的这个固有的局限性,ASP.NET 包括了几个选项来帮助你在单页面和应用程序中保持数据。这些特征如下所示:

  • 视图状态

  • 控件状态

  • 隐藏字段

  • Cookies

  • 查询字符串

  • 应用程序状态

  • 会话状态

  • 档案属性

视图状态、控件状态、隐藏字段、Cookies、以及查询字符串包括了在客户端保存数据的不同方法。但是,应用程序状态、会话状态、以及档案属性则在服务器的内存中保存数据。每个选项都有各自不同的优势和缺点,这取决于具体情况而定。

基于客户端的状态管理选项

下列部分描述了在页面或者客户端计算机中保存信息的状态管理选项。这些选项在回传的过程中不需要在服务器中维护任何信息。

视图状态

ViewState 属性提供了一个字典对象来为相同的页面在多个请求之间保持值。这是页面在回传过程之间用来保持页面和控件属性值的默认方法。

一旦页面被处理,页面和控件的当前状态就会被混列进一个字符串并且保存成页面的一个隐藏字段,如果被保存在 ViewState 属性中的数据个数超出了 MaxPageStateFieldLength 属性所指定的值,那么页面中将出现多个隐藏字段。当页面被回传到服务器的时候,被回传的页面会在初始化并恢复属性信息的时候对其中的视图状态字符串进行处理。

你能够把值保存到视图状态中。关于详细内容,请参考:[ASP.NET 实践:在视图状态中保存值]。关于应该在何时使用视图状态的建议,请参考:[ASP.NET 状态管理的建议]。

控件状态

有时候你需要为了控件的正常工作而保存控件的状态数据。例如,如果你编写了一个使用不同的制表页来显示不同信息的自定义控件,如果要想让控件能够正常工作,那么控件就需要在回传的过程中知道哪个制表页是被选中的。ViewState 属性就能够用于这个目的,但是视图状态能够页面级别被开发者所关闭,从而破坏了控件的正常功能。要解决这个问题,ASP.NET 页面框架暴露了一个被称作控件状态的 ASP.NET 特征。

ControlState 属性允许你保持特定控件的属性信息,并且不会像 ViewState 属性一样能够被关闭。

隐藏字段

ASP.NET 允许你在 HiddenField 控件中保存信息,该控件是作为一个标准的 HTML 隐藏字段而呈现在页面中的。隐藏字段在浏览器中是不可见的,但是你能够像标准控件一样来设置它的属性。当页面被提交到服务器之后,隐藏字段的内容会连同其他控件一起被发送到 HTTP 窗体集中。隐藏字段为所有需要直接保存到页面中的特定信息而扮演着贮藏室的角色。

安全提示:恶意用户很容易就能够查看到隐藏字段的内容并且进行更改。所以,请不要把任何机密信息或者应用程序正常工作时所必需的信息保存到隐藏字段中。关于更多信息,请参考:[ASSP.NET 状态管理的建议]。

HiddenField 控件在它的 Value 属性中保存单个变量并且必须被明确地被添加到页面中。关于详细信息,请参考:[HiddenField Web 服务器控件概览]。

要在页面处理期间使隐藏字段的值生效,你必须使用 HTTP POST 命令来提交页面。如果你使用隐藏字段并且页面是为了响应连接或者 HTTP GET 命令而被处理的,那么隐藏字段将不再有效。关于使用建议,请参考:[ASP.NET 状态管理的建议]。

Cookies

Cookies 是既能够保存在客户端文件系统的文本文件中也能够保存在客户端浏览器的会话内存中的少量数据。它包含服务器连同页面输出一起被发送到客户端的网站特定信息。Cookies 能够是临时性的(通过指定过期时间和日期)也能够是持久性的。

你能够使用 Cookies 来保存关于特定的客户端、会话、或者应用程序的相关信息。Cookies 被保存在客户端设备中,并且在浏览器请求页面的时候,客户端会连同请求信息一起发送 Cookies 中的信息。服务器能够读取这些 Cookies 并且提取它们的值。Cookies 的一个典型用途就是用来保存指示用户地否被应用程序所验证的记号(可能已经被加密)。

安全提示:浏览器只能够把数据回发到最初创建 Cookies 的服务器。但是,恶意用户也能够对 Cookies 进行访问并且读取它们的内容。所以建议你不要在 Cookies 中保存机密信息(如用户名称或者密码)。而是在 Cookies 中保存识别用户的记号,然后使用这个记号来查寻服务器上的机密信息。

关于更多使用 Cookies 的信息,请参考:[Cookies]和[ASP.NET 状态管理的建议]。

查询字符串

查询字符串是被添加到页面 URL 结束部分的信息。典型的查询字符串看起来可能像下列实例:

http://www.contoso.com/listwidgets.aspx?category=basic&price=100

在上面的 URL 路径中,查询字符串使用问号(?)作为开始并且包括两个 Attribute/Value 数据对,一个被命名为 category 而另一个被命名被 price。

查询字符串为维护状态信息提供了一个简单的方法,但是它仍然受到某种程度的限制。例如,它们在从一个页面到另一个页面传递数据的时候是非常方便的,如从一个页面中传递一个产品编号到另一个将会对该编号进行处理的页面中。但是,有些浏览器和客户端设备却限制了 URL 的长度最多不能够超过 2083 个字符。

安全提示:在查询字符串中被传递的信息能够被恶意用户所篡改。请不要在查询字符串中包含重要数据或机密数据。另外,用户能够对 URL 进行标记或者把 URL 发送给其他的用户,因此查询字符串也被连同在一起被标记或者被转发。关于更多信息,请参考:[ASP.NET 状态管理的建议]和[ASP.NET 实践:在 Web 应用程序中对字符串进行 HTML 编码来保护反向脚本开发]。

要在页面处理期间使查询字符串的值生效,你必须使用 HTTP GET 命令来提交页面。也就是说,你不能在页面回应 HTTP POST 命令的处理过程中获得查询串的优势。关于使用建议,请参考:[ASP.NET 状态管理的建议]。

基于服务器的状态管理选项

ASP.NET 为你提供了在服务器上维护状态信息的多种方式,胜于客户端的信息保持。使用基于服务器的状态管理,你能够减少需要发送给客户端所保持的状态信息量,但是它需要在服务器中使用昂贵的资源。下列部分描述了三个基于服务器的状态管理特征:应用程序状态、会话状态、以及档案属性。

应用程序状态

ASP.NET 允许你使用应用程序状态来保存值,每一个活动的 Web 应用程序中都有一个 HttpApplicationState 类的实例。应用程序状态是一个全局存储机制,Web 应用程序中的所有页面都能够对其进行访问。因此,应用程序状态有助于保存需要在服务器回传过程之间以及页面的请求之间所维护的信息。关于更多信息,请参考:[ASP.NET 应用程序状态概览]。

应用程序状态被保存在每个特定 URL 的请求期间所创建的一个 Key/Value 字典中。你能够把特定的应用程序信息添加到这个结构中,以在页面请求之间实现共享。

一旦你把特定的应用程序信息保存到应用程序状态中,服务器就会对它进行管理。关于使用建议,请参考:[ASP.NET 状态管理的建议]。

会话状态

ASP.NET 允许你使用会话状态来保存值,每一个活动的 Web 应用程序会话中都有一个 HttpSessionState 类的实例。关于详细内容,请参考:[会话状态概览]。

会话状态类似于应用程序状态,不同之处就是它只适用于当前浏览器会话的范围。如果有不同的用户在使用应用程序,那么每个用户会话中都将拥有不同的会话状态。另外,如果用户离开了应用程序并且再次回来,第二个用户会话的会话状态将完全区别于第一个会话。

会话状态由一个 Key/Value 字典所组成,用来保存需要在服务器回传过程之间和页面的请求之间所维护的特定话信息。关于更多信息,请参考:[会话状态概览]。

你能够使用会话状态来完成下列任务:

  • 单独识别浏览器或客户端设备的请求并把它们映射到服务器中的单独会话实例中。

  • 为在相同会话中使用跨多个浏览器或客户端设备的请求而在服务器中保存会话的特定数据。

  • 引发适当的会话管理事件。另外,你可以编写应用程序代码来处理这些事件。

一旦你在会话状态中添加了特定的应用程序信息之后,服务器就会对该对象进行管理。这取决于你所指定的选项,会话信息能够被保存进 Cookies、进程外服务器、或者是运行 Microsoft SQL Server 的计算机。关于使用建议,请参考:[ASP.NET 状态管理的建议]。

档案属性

ASP.NET 提供了一个被称作档案属性的特征,允许你保存特定的用户数据。这个特征与会话状态类似,不同之处就是档案数据不会在用户的会话过期的时候被丢失。档案属性特征所使用的 ASP.NET 档案被保存在一个持续格式中并且与单独的用户相关联。ASP.NET 档案允许你在不需要创建并维护自定义数据库的情况下来简化对用户信息的管理。另外,档案还使用一个强类型的 API 使用户信息能够生效,你能够在应用程序的任何位置对这个 API 进行访问。你能够在档案中保存任何类型的对象。ASP.NET 档案特征提供了一个普通的存储系统来允许你在仍然需要在类型安全规则中使数据生效的情况下定义并维护几乎所有类型的数据。

要使用档案属性,你必须先配置一个档案提供者。ASP.NET 包括一个允许你在 SQL 数据库中保存档案数据的 SqlProfileProvider 类,但是你同样能够创建自定义的档案提供者类,把档案数据以自定义的格式保存到一个自定义存储机制中(如 XML 文件、或者甚至是 Web Services)。

因为保存在档案属性中的数据并没有被保存到应用程序的内存中,所以可以防止在 Internet 信息服务(IIS)被重启和工作者进程被重启的时候所造成的数据丢失。另外,档案属性还能够跨多个进程(如 Web 农场或 Web 花园)而被保持。关于更多信息,请参考:[ASP.NET 档案属性概览]。

转载于:https://www.cnblogs.com/Laeb/archive/2007/01/10/616988.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/305713.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

linux udp端口大数据包,Linux协议栈中UDP数据报从网卡到用户空间流程总结

NAPI驱动流程:中断发生-->确定中断原因是数据接收完毕(中断原因也可能是发送完毕,DMA完毕,甚至是中断通道上的其他设备中断)-->通过netif_rx_schedule将驱动自己的napi结构加入softnet_data的poll_list链表,禁用网卡中断&am…

浅谈.NET技术公司的实习生培养

浅谈.NET技术公司的实习生培养背景近几年.NET开发者市场的越发不景气,一毕业就选择.NET技术的开发者更是少之又少。一方面是公司效益的日益提高,一方面却是招聘优秀人才的速度总是赶不上公司发展的速度,这样的矛盾不断的倾轧着技术管理者的内…

禁止自动播放功能

运行gpedit.msc打开组策略,在“管理模板--系统”右侧双击“关闭自动播放”,然后设置为“已启用”,并在“关闭自动播放”下拉列表中选择“所有驱动器”,最后“确定”即可。这个设置在“计算机配置”和“用户配置”中都有&#xff0…

MBR的Linux分区机制启动过程,linux系统启动流程(MBR)

总:POST---> Boot Squence ---> Bootloader ---> kernel ---> init---> 完成启动系统:CentOS61、按下电源,cpu找到CMOS中的BIOS并运行起来,这个小程序会完成硬件自检。BIOS:Basic Input and Output Sys…

.netcore 极速接入第三方登录

新年新气象,趁着新年的喜庆,肝了十来天,终于发了第一版,希望大家喜欢。如果有不喜欢看文字的童鞋,可以直接看下面的地址体验一下:Github: https://github.com/mrhuo/MrHuo.OAuth唯一官网:https:…

linux watch 文件大小,Linux watch命令的使用

1.命令简介watch 命令以周期性的方式执行给定的命令,并全屏显示执行结果。watch 是一个非常实用的命令,基本所有的 Linux 发行版都带有。如同名字一样,watch 可以帮助监测一个命令的运行结果,省得我们一遍遍地手动运行。比如 tail…

在ISA 2006标准版上定制带宽和限制流量(测试)

最的忙于工作上的事,有点烦躁,很少有心情能静下来去看看书或是做些实验了。这是个不好的现象。 一直想着在ISA SERVER上做一些带宽和流量方面的测试,没有找到较好的软件。偶尔从朋友那得到一款,虽说是英文的,也蛮不错…

.NET 中 async 和 await

前言C# 中的 Async 和 Await 关键字是异步编程的核心。使用这两个关键字可以轻松创建异步方法。使用 async 关键字定义的异步方法简称“异步方法”。异步编程并发的一种形式,它采用furture模式或回调(callback)机制,以避免产生不必要的线程。.Net中futur…

Javascript 常用技巧 [2]

Javascript 常用技巧 [2] /**请问如何去掉主页右面的滚动条&#xff1f; <!-- <body scroll"no"> --> <!-- <body style"overflow-y:hidden"> --> ******************************** 怎样不使用页面的缓存&#xff1f;即每一次打…

mongodb可视化工具 linux,Linux中安装启动MongoDB与可视化工具

MongoDB 提供了 linux 各发行版本 64 位的安装包&#xff0c;你可以在官网下载安装包。下载地址&#xff1a;https://www.mongodb.com/download-center#community下载完安装包&#xff0c;并解压 tgz(以下演示的是 64 位 Linux上的安装) 。curl -O https://fastdl.mongodb.org/…

年轻有为的老黄2020

0x01 不知道开篇要说什么好&#xff0c;那就来个经典的 0x01 吧。这个世界不止苟且&#xff0c;还有诗和远方。工作 工作上面还算是比较忙碌的&#xff0c;在20年也做了很多东西&#xff0c;本来面试进公司的时候title是高开&#xff0c;在基础架构组&#xff0c;光杆部门。过完…

VS.NET调试问题

Q:VS.NET调试问题 A:关于VisualStudio.NET里调试出现的一系列问题&#xff0c;例如没有权限调试Web服务器&#xff0c;不属于Debugger Users组、无法调试等情况&#xff0c;都可以在The VS7 Debugger doesn’t work. What can I do(http://blogs.msdn.co…

linux调用odbc接口乱码,linux中pypyodbc读取GB编码mdb中文乱码解决办法

当前1.3.3版本的pypyodbc在linux系统上面已经可以读取有中文字符的mdb文件,不再出现异常,但是读取的中文字符却全是乱码。下面是根据一些现象的合理推论:mdb文件来自于windows系统,其中的中文字符使用GB编码无疑,但linux系统上mdbtools提供的odbc驱动底层已经执行了编码转换,将…

推荐:Dapper扩展-Dapper.SimpleCRUD

背景Dapper目前应该是大家比较喜欢的orm框架之一&#xff0c;但是它灵活的背后&#xff0c;还是有很多不尽人意的地方&#xff0c;谁想编写基本的读取/插入/更新/删除语句&#xff1f;下面推荐SimpleCRUD为Dapper提供了简单的CRUD帮助器。解放了大家&#xff0c;提高生产力。功…

创建虚拟磁盘的小工具软件plainmaker.exe

此小工具,在虚拟机中做集群实现时用到!其下载地址如下:[url]http://www.vmware.cn/Soft/69.html[/url]

Linux下的MySQL测试,Linux下MySQL命令(1)

启动命令&#xff1a;$ ./mysqld_safe --defaults-file/home/mysql/local/mysql_sale_mirror/etc/my.cnf --basedir/home/mysql/local/mysql_sale_mirror/ --datadir/home/mysql/local/mysql_sale_mirror/var/ --pid-file/home/mysql/local/mysql_sale_mirror/var/mysql.pid --…

深入浅出Dotnet Core的项目结构变化

有时候&#xff0c;越是基础的东西&#xff0c;越是有人不明白。前几天Review一个项目的代码&#xff0c;发现非常基础的内容&#xff0c;也会有人理解出错。今天&#xff0c;就着这个点&#xff0c;写一下Dotnet Core的主要类型的项目结构&#xff0c;以及之间的转换和演化。一…

群策群力:破机房征求灵丹妙药

我校有一年代久远之计算机教室&#xff0c;现已经迈入日落西山之境。特征求灵丹妙药&#xff0c;不求妙手回春&#xff0c;只愿其能为我校的信息技术教育事业再尽最后一把微力&#xff0c;也为我校即将面临无地授课的教师提供继续上岗的救命稻草一枝。具体情况说明&#xff1a;…

使用 C# 9 的records作为强类型ID - 路由和查询参数

上一篇文章&#xff0c;我介绍了使用 C# 9 的record类型作为强类型id&#xff0c;非常简洁public record ProductId(int Value);但是在强类型id真正可用之前&#xff0c;还有一些问题需要解决&#xff0c;比如&#xff0c;ASP.NET Core并不知道如何在路由参数或查询字符串参数中…

linux sudo 必须属于用户ID0,sudo:/usr/bin/sudo 务必属于用户 ID 0(的用户)并且设置 setuid 位...

今天手抖本来要修改/usr/bin/下面的一个文件属性为 user:user&#xff0c;执行chown -R /usr/bin/的时候&#xff0c;再按tab之前直接敲了回车&#xff1b;结果导致执行sudo命令时出现错误提示&#xff1a;“sudo&#xff1a;/usr/bin/sudo 必须属于用户 ID 0(的用户)并且设置…