20编程21编程爱好者22vb编程,23数控编程24编程中国25编程论坛26编程语言27游戏编程28编程软件下载29编程工具30socket编程31网络编程32编程器33c语言编程,34flash编程35编程软件36数控车床编程37windows编程38编程入门,39windows核心编程40cnc编程41vc 编程,42linux 编程43asp编程44vb编程实例45串口编程46手机编程47编程教程48plc编程,49单片机编程50vc 网络编程51excel编程,52unix网络编程53编程学习,54编程之道55数据库编程56单片机编程器57黑客编程58计算机编程59网页编程60嵌入式编程,61编程高手箴言62flash编程教程63vfp编程64windows网络编程,65编程基础66c语言编程实例67c语言编程软件68vf编程69shell编程,70vb数据库编程71matlab编程,72c语言编程工具73编程思想74php编程,75c编程76jsp编程77电脑编程技巧与维护,78三菱plc编程软件,79vb编程软件下载80pb编程81数控编程实例82asp编程工具,83c专家编程,84win32编程85数控铣床编程86asp.net高级编程,,87vc 数据库编程88vba编程89jsp高级编程90c语言编程宝典,91unix环境高级编程;92编程珠玑93delphi编程94delphi数据库编程95vb编程教程96单片机编程软件
1编程爱好者网站2vb编程网站,3电子商务网站编程4游戏编程网站5最大的编程网站6网站编程软件7可编程逻辑中文网站8网站 编程 语言9网站编程 数据库,10jsp网站编程11asp编程网站12网站编程电子书13好的编程网站,14c语言编程网站15编程门户网站16如何学习网站编程17百度网站的编程语言18vb编程乐园网站指南19wince 编程网站
1asp.net2asp教程,3asp源码4asp免费空间5asp论坛6asp代码7asp源代码8asp下载,9asp源码下载10asp木马11asp.net教程12asp学习13什么是asp14asp空间,15admin.asp dir16asp程序17asp教程下载18asp.net 2.019asp整站程序,20asp文件21十天学会asp22asp入门23asp源程序24asp实例25asp函数26asp服务器27asp.net论坛28asp id,29asp整站下载30asp网站31asp论坛下载32asp源代码下载,33asp整站34asp技术35asp access36asp.net源码37asp简介38asp免费空间申请39asp.net下载,40asp留言板41asp sql42asp 数据库43asp站长助手44asp连接数据库45asp留言本,46asp.net教程下载47asp分页48asp格式49asp论坛程序50asp.net源代码51asp软件52asp模板53asp session54asp语法,55如何打开asp文件56asp解密57asp编程58asp.net实例,59asp实例教程60asp程序下载61asp计数器62asp.net入门,63asp运行环境64asp基础教程65apache asp66asp入门教程,67asp编辑器68asp组件69asp连接access70conn.asp71asp书籍,72asp论文73asp工具74asp文件上传75asp探针76asp原代码下载77asp include78user wantpws.asp79asp split,80asp fso81asp网页制作82printpage.asp83什么是asp.net,84index.asp85asp.net datagrid86asp基础87asp replace88asp代码下载89asp新闻系统
1php论坛2免费php空间,3php下载4php源码5php mysql6php教程7php文件8php空间9apache php10什么是php11apache php mysql12php学习13php论坛下载14iis php15php cms16php入门17php blog18php手册,19php代码20php整站程序21php session22php安装23php源码下载24php配置25php源代码26php cookie27php网站28iis php mysql29php编程30php留言板31php探针32php注入33php.ini34php运行环境35index.php36php教程下载,37php论坛程序38php 文件上传39php服务器40php环境41php 函数;42php格式43php编辑器44php editor45如何打开php文件46php access47十天学会php48php模板49php xml;50php程序51php留言本52php文件怎么打开53php技术54ajax php55php简介56php注入工具57打开php文件58php语言59php mail;60php软件;61免费php mysql空间62php self63php 数组.64php分页,65php nuke66php阅读器67免费php空间申请68国外免费php空间69php程序下载70php 正则表达式71asp php,72php网站管理系统73php程序设计74php是什么文件75php 实例76php 开发工具77php 验证码78php官方网站79php学习资料
1jsp教程2jsp源码3jsp论坛4什么是jsp5jsp源代码6jsp空间7jsp学习8jsp文件9jsp mysql,10jsp入门11jsp连接数据库12jsp技术13eclipse jsp14jsp分页15jsp源代码下载16jsp access17jsp教程下载18jsp开发工具,19jsp代码20jsp简介21jsp环境配置22jsp连接mysql,23jsp实例24免费jsp空间25jsp配置26jsp session,27jsp运行环境28jsp下载29jsp网站30jsp include31jsp编程,32jsp介绍33jsp 数据库34jsp设计35jsp servlet36jsp标签37jsp应用开发详解38jsp 中文39jsp oracle40jsp论文41jsp 文件上传,42jsp高级编程43jsp源码下载44jsp 乱码45jsp开发46jsp分页显示47jsp sql48jsp连接sql49jsp 页面跳转50jsp request51eclipse开发jsp52iis jsp53jsp开发环境54jsp sqlserver,55jsp cookie56jsp服务器57jsp连接access58jsp毕业论文59jsp新闻发布系统60jsp留言板61jsp 电子书62jsp forward63jsp中文网64tomcat jsp65jsp语法66jsp留言本67asp jsp,68jsp import69jsp源程序70jsp基础71jsp毕业设计,72jsp格式73jsp 中文乱码,74jsp开发实例75jsp书籍76jsp论坛下载77jsp 上传,78jsp计数器79jsp 注释80jsp电子教程81jsp 保存用户名密码,82jsp的优点83jsp软件下载84jsp语言85jsp代码下载86jsp blog87jsp 打印88jsp手册

思顿科技-专业网站制作指南、网页设计制作教程、免费网页制作素材下载、免费学习网页制作指南,专业网站建设服务、网站制做指南、免费网页制作指南、网页制作服务、免费空间域名服务、
首页
网页教程
网页素材
收录查询
工具下载
网站欣赏
网站论坛
免费博客
建站服务

ASP.NET保持用户状态的九种选择(下)
你当前的位置:网站制作指南 --> 技术文档全集 (www.STasp.com)

  ASP.NET中的新状态容器

  前面我们提到,ASP.NET为保存用户请求间的数据添加了几种新的途径。这些途径给了你如何保持状态信息更好的控制。这些技术的范围可以窄到只有一个请求那么小(CONTEXT对象),也可以宽到整个WEB服务器和服务器上的所有应用程序(MACHINE.CONFIG文件)。在多数情况下你有多种保存特定数据片的选择--使用每个方法描述的问题和答案来决定某个对象是否适合你的需要。

  CACHE

  CACHE对象用于单个用户、一组用户或所有的用户。这种数据为多个请求保持。它可以保持很长时间,但是不能超过应用程序重新启动的时间,并且数据的终止基于时间或者其它的依赖关系。它可以高效率地保持大量或少量地数据。

  CACHE 是ASP.NET中最"酷"的对象之一。它提供了难以置信的灵活性、通用性和性能,因此在ASP.NET应用程序中它通常是比APPLICATION或SESSIONS更好的保持数据的对象。本文没有详细介绍CACHE对象的使用方法,但是仍然可以说它是一个万能对象。与其它的集合对象相似,它是一个简单的名称-值集合,但是通过使用指定特定用户的键值可以缓存特定用户的值。同样你可以缓存不同的相关数据的多个数据集,例如几个有键(如FORDCARS 、 CHEVYCARS、GMCARS)的汽车集合。CACHE中的数据可以给定一个绝对的、可变的或基于文件的终止时间。它们也实现了一个回调功能,在被缓存的值从缓存中提取时被调用,这个功能很有用,因为接着你能检查它是否为最新的数据变量,如果不是(或数据源不可用),就重新缓存被终止的值。

  添加和访问缓存中值的语法与先前谈到的相似。但是CACHE给访问集合内容的标准索引器方法作了补充,它支持多种方法,允许对被缓存数据的更多的控制。最频繁使用的方法是INSERT,它支持几种重载,允许你指定依赖、超时值、优先级和回调。下面是一些简单的例子:


// 给缓存添加项
CACHE["MYKEY"] = MYVALUE;

// 从缓存中读取项
RESPONSE.WRITE(CACHE["MYKEY"]);

// 把CACHEDURATION增加10秒并把项添加到缓存中
CACHE.INSERT("MYKEY",MYVALUE, NULL, SYSTEM.DATETIME.NOW.ADDSECONDS(10),
SYSTEM.WEB.CACHING.CACHE.NOSLIDINGEXPIRATION);
 

  CACHE对象的最强大的特性之一是当缓存中的某个项终止时执行回调的能力。它使用了委托或函数指针,这在本文中没有讨论。幸运的是一旦你有了某些这些技术怎样工作的示例,就能通过简单的剪切和粘贴在应用程序中使用它们,不需要知道委托是怎样工作的复杂过程。有很多使用这种功能的原因,最通常的是在数据终止时用当前数据重新填充缓存,或者如果重新填充缓存的数据源不可用时恢复旧的缓存数据。

  在我的例子中,简单地缓存了当前时间,当缓存超期的时候,我将给缓存中的字符串末尾添加一个星号(*)。在超过时间后,你能通过计算星号的数量来确定缓存超期了多少次。图9演示了回调的重要概念,并且提供了给使用缓存建立更多功能回调程序的好模板。


PRIVATE VOID PAGE_LOAD(OBJECT SENDER, SYSTEM.EVENTARGS E)
{
 STRING CACHEKEY = "MYKEY";
 STRING DATA = "";
 // 检查数据是否已经被缓存了
 IF(CACHE[CACHEKEY]==NULL)
 {
  // 因为数据在缓存中,所有读取数据
  DATA = SYSTEM.DATETIME.NOW.TOSTRING();

  //建立回调委托的一个实例
  CACHEITEMREMOVEDCALLBACK CALLBACK =NEW CACHEITEMREMOVEDCALLBACK(ONREMOVE);

  LABEL1.TEXT = "GENERATED: " + DATA;

  CACHE.INSERT(CACHEKEY,DATA,NULL,
      SYSTEM.DATETIME.NOW.ADDSECONDS(5),
      SYSTEM.WEB.CACHING.CACHE.NOSLIDINGEXPIRATION,
      SYSTEM.WEB.CACHING.CACHEITEMPRIORITY.DEFAULT,
      CALLBACK);
 }
 ELSE
 {
  LABEL1.TEXT = "CACHED: " + CACHE[CACHEKEY].TOSTRING();
 }
}

PRIVATE VOID ONREMOVE(STRING KEY, OBJECT VAL,CACHEITEMREMOVEDREASON REASON)
{
 //建立回调委托的一个实例
 CACHEITEMREMOVEDCALLBACK CALLBACK =NEW CACHEITEMREMOVEDCALLBACK(ONREMOVE);
    CACHE.INSERT(KEY,VAL.TOSTRING() +
    "*",NULL,SYSTEM.DATETIME.NOW.ADDSECONDS(5),CACHE.NOSLIDINGEXPIRATION,
    SYSTEM.WEB.CACHING.CACHEITEMPRIORITY.DEFAULT, CALLBACK);
}
 

代码段5.缓存回调示例

  注意代码段中一个重要的特性是在PAGE_LOAD中使用模式(PATTERN)来确定是否使用缓存中的数据。当你处理缓存中的项时也可能使用这种模式。使用IF语句来检查缓存的当前内容是否为空(因为要多次引用,为缓存键使用了一个变量)。如果是空的,从数据源生成数据并放入缓存中。如果不是空的,从缓存中返回数据。如果数据访问逻辑很复杂,你需要把整个IF语句放入一个独立的函数,该函数的任务是检索数据。
CACHE对象的功能比先前我们讨论的大多数对象多得多。这也是ASP.NET更强大的功能之一,并且我明确地推荐阅读关于它的更多内容。

  CONTEXT

  CONTEXT对象保持单个用户、单个请求的数据,并且数据只在该请求期间保持。CONTEXT容器可以保持大量的数据,但是典型的情况下是保存小的数据片,因为它经常通过GLOBAL.ASAX中的某个处理方法为每个请求实现。

  CONTEXT容器(从PAGE对象访问或使用SYSTEM.WEB.HTTPCONTEXT.CURRENT)被提供用于保持需要在不同的HTTPMODULES和HTTPHANDLERS之间传递的值。它也可以用于保持某个完整请求的相应信息。例如,IBUYSPY入口在GLOBAL.ASAX中的APPLICATION_BEGINREQUEST事件过程中给容器填满了许多配置信息。注意这只在当前请求中可用,如果你希望在下一个请求中也能使用,请考虑使用VIEWSTATE。

  从CONTEXT集合中设置和获取数据使用的语法与前面讨论的其它集合对象(如APPLICATION、SESSIONS和 CACHE)的相似。下面是两个简单的例子:


// 给CONTEXT添加项
CONTEXT.ITEMS["MYKEY"] = MYVALUE;

// 从CONTEXT中读取项
RESPONSE.WRITE(CONTEXT["MYKEY"]);

 

  VIEWSTATE

  VIEWSTATE为单个用户保持状态信息,保持期为ASPX页面工作时间。VIEWSTATE容器可以保持大量的数据,但是必须小心管理VIEWSTATE的大小,因为它增加了每个请求和回应的下载(DOWNLOAD)大小。

  VIEWSTATE是ASP.NET中的一个新容器,也许你已经使用它了,但是你可能还是不了解它。这是因为所有的内建WEB控件都使用VIEWSTATE在页面回发(POSTBACK)间保持自己的值。但是你必须小心,因为它影响应用程序的性能。影响的大小依赖于回发之间使用VIEWSTATE的多少--对大多数WEB窗体来说数量非常小。

  确定某个页面上每个控件使用的VIEWSTATE的数量最简单的方法是打开页面追踪并检查每个控件负载了多少个VIEWSTATE。如果某个特定控件不需要在回发之间保持数据,请通过把ENABLEVIEWSTATE设置为FALSE关闭该对象的VIEWSTATE。你也可以通过在浏览器中查看的HTML源并检查隐藏窗体字段__VIEWSTATE来确定某个给定的ASP.NET页面VIEWSTATE的总共大小。注意这些内容都是使用BASE64编码的,用于放置偶然的查看和维护。VIEWSTATE也可以通过给@PAGE指令添加ENABLEVIEWSTATE="FALSE"在整个页面中禁止。

  典型的WEB窗体不需要直接维护VIEWSTATE。但是如果你建立自定义WEB控件,就需要了解它是怎样工作的,并为你的控件实现它,这样该控件的工作方式才能与随ASP.NET发布的WEB控件同样地工作。向VIEWSTATE读取或写入值都可以通过上面讨论地其它集合对象的语法完成:


// 给VIEWSTATE添加项
VIEWSTATE["MYKEY"] = MYVALUE;

//从CONTEXT读取项
RESPONSE.WRITE(VIEWSTATE["MYKEY"]);
 

  当建立自定义WEB控件时,你也许希望它们有VIEWSTATE的好处。这在控件的属性层可以简单实现。代码段6演示了怎样保存一个简单的自定义控件的PERSONNAME属性到VIEWSTATE中,并在该控件的RENDER方法中使用它。


NAMESPACE MSDN.STATEMANAGEMENT
{
 PUBLIC CLASS HELLOPERSON : SYSTEM.WEB.UI.CONTROL
 {
  PUBLIC STRING PERSONNAME
  {
   GET
   {
    STRING S = (STRING)VIEWSTATE["PERSONNAME"];
    RETURN ((S == NULL) "" : S);
   }
   SET
   {
    VIEWSTATE["PERSONNAME"] = VALUE;
   }
  }
  PROTECTED OVERRIDE VOID RENDER(SYSTEM.WEB.UI.HTMLTEXTWRITER WRITER)
  {
   WRITER.WRITE("HELLO " + PERSONNAME);
  }
 }
}

代码段6.在VIEWSTATE中保存数据

  WEB.CONFIG和MACHINE.CONFIG文件

  这些文件中的数据对于某个应用程序的所有用户来说都可以使用。WEB.CONFIG文件中存储的数据可用于应用程序的整个生命周期。这些数据一般很小,该对象一般用于保持文件位置和数据库连接的字符串。大的数据片最好保存在其它位置。

  作为其它多样集合对象的补充,ASP.NET引入了一组XML配置文件用于管理应用程序甚至于整个服务器的很多设置。每个ASP.NET应用程序使用WEB.CONFIG文件来设置它的许多属性,每个服务器在系统文件夹下有一个作为应用程序基础的MACHINE.CONFIG文件。这些设置都作为默认值使用,除非重载。作为保存配置数据的补充,这些文件可以保存应用程序(或多个应用程序)需要的数据。

  无论什么时候应用程序启动都会读取配置信息,接着这些信息被缓冲。由于被缓冲了,应用程序可以快速读取它们,因此不需要考虑应用程序的瓶颈,因为它经常执行某个文本文件的一些整型信息。此外,某个应用程序的WEB.CONFIG的改变将导致应用程序重新启动。这确保了对配置文件信息的修改立即反映到应用程序中。

  数据库连接信息,默认图像路径和XML数据文件路径是通常保存在WEB.CONFIG文件中的数据片。在WEB.CONFIG文件中保存数据的语法如下,在理想的情况下你也许希望使用集成的SQL身分验证:


<CONFIGURATION>
<!-应用程序特殊设置 -->
<APPSETTINGS>
<ADD KEY="CONNECTIONSTRING" VALUE="SERVER=MYDBSERVER;
UID=MYUID;PWD=MYPASSWORD;DATABASE=MYDB" />
</APPSETTINGS>
<SYSTEM.WEB>
<!-所有的WSB设置 -->
</SYSTEM.WEB>
</CONFIGURATION> 

  为了访问ASP.NET页面中的值,可以使用CONFIGURATIONSETTINGS集合,它在SYSTEM.CONFIGURATION名字空间中。下面的简单例子演示了怎样提取前面的连接字符串到一个本地变量中:

USING SYSTEM.CONFIGURATION;
OOO
STRING STRCONNSTRING =
CONFIGURATIONSETTINGS.APPSETTINGS["CONNECTIONSTRING"];

  给SYSTEM.CONFIGURATION名字空间添加一个引用减少了引用这些值的代码数量。因为对WEB.CONFIG或 MACHINE.CONFIG的修改将导致应用程序立即重新启动,典型情况下这些值只由服务器系统管理员手动修改。因此你可以认为这些文件是保存只读数据而不是应用程序中修改的数据的好位置。

  结论

  有效的状态管理意味着识别的用户经验、数据错误与快速的页面或事务处理之间的巨大差别。尽管状态管理在ASP 3.0中不太适用,但是ASP.NET把它带到了本文讨论的状态对象的控制之下。小心地使用它们将使你给用户展示最佳的WEB经验。


 

 
| 关于我们 | 联系我们 | 业务合作 | 友情链接 | 网站地图 |
版权所有©思顿科技-专业网站制作指南2004-2006 在线技术支持- QQ:63127313