仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 775|回复: 8
打印 上一主题 下一主题

[学习教程] ASP.NET编程:小议优化ASP.NET使用功能之ViewState篇...

[复制链接]
深爱那片海 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-16 22:44:55 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
捆绑编译器。用户不需要受制于厂家,自己就能将程序在新平台上编译运行。除了牛B轰轰的linux,估计也没有系统捆绑c/c++的编译器,而且许多新平台都无法支持复杂的c/c++编译器在上面直接运行。asp.net|功能|优化假如你有在IE中检察以后扫瞄页面HTML源代码的习气,你大概常会看到相似以下的代码片段:
<inputtype="hidden"name="__VIEWSTATE"value="dDwtMzU5NzUyMTQ1O3Q8O2w8aTwwPjs+O2w8dDw7bDxpPDA+Oz47bDx0PDtsPG
……
伶俐的你必定会问,这是甚么?有甚么感化?它与本篇文章有何转机亲干系?列位看官,且听我渐渐道来。
实在,这就是MS在Asp.net使用ViewState手艺的特性体现。为了页面能在PostBack后仍然能读取服务器控件原本的形态数据,Asp.net中利用了ViewState手艺,而ViewState手艺实质上是用一个默许称号为"__VIEWSTATE的Hidden范例表单域来保留和传送数据(这些数据是经由了序列化后Base64编码的字符串值,且是在办法Page.SavePageStateToPersistenceMedium输入前保留、并由Page.LoadPageStateFromPersistenceMedium加载)。固然我们能够经由过程三种级别来轻松禁用失落这些数据的往复传送:
Machine级在machine.config中设置<pagesenableViewStateMac=false/>
Application级在WebApplicatin的web.config中设置<pagesenableViewStateMac=false/>
单页面级在该页面中设置<%@PageenableViewStateMac=false%>或经由过程代码设置Page.EnableViewStateMac=false;

但是,假如我们完整能经由过程禁用ViewState来办理数据传输包袱并且不发生反作用的话,那MS的架构师们也不会傻到云云心爱的境地(无关紧要的东东留它何用?),正因我们常常不克不及经由过程复杂的禁用来办理这个传输包袱成绩,以是我们只能另辟路径使之在收集往复中传输量尽量地小,因而,紧缩成了我们的首选。只需我们重载Page类的SavePageStateToPersistenceMedium()办法与LoadPageStateFromPersistenceMedium()办法,并在重载办法中对数据举行紧缩与解压的处置便可。开源项目SharpZipLib供应的类GZipInputStream与GZipOutputStream进进了我们的视野,为了便利,无妨写个类CompressionHelper,代码以下:
1usingSystem.IO;
2usingICSharpCode.SharpZipLib.GZip;
3
4namespaceYcweb.Components
5{
6/**////<summary>
7///SummarydescriptionforCompressionHelper.
8///</summary>
9publicclassCompressionHelper
10{
11publicCompressionHelper()
12{
13//
14//TODO:Addconstructorlogichere
15//
16}
17
18/**////<summary>
19///紧缩数据
20///</summary>
21///<paramname="data">待紧缩的字节数组</param>
22///<returns>紧缩后的字节数组</returns>
23publicstaticbyte[]CompressByte(byte[]data)
24{
25MemoryStreamms=newMemoryStream();
26Streams=newGZipOutputStream(ms);
27s.Write(data,0,data.Length);
28s.Close();
29returnms.ToArray();
30}
31
32/**////<summary>
33///解压数据
34///</summary>
35///<paramname="data">待解压的字节数组</param>
36///<returns>解压出的字节数组</returns>
37publicstaticbyte[]DeCompressByte(byte[]data)
38{
39byte[]writeData=newbyte[2048];
40MemoryStreamms=newMemoryStream(data);
41Streamsm=newGZipInputStream(ms)asStream;
42MemoryStreamoutStream=newMemoryStream();
43while(true)
44{
45intsize=sm.Read(writeData,0,writeData.Length);
46if(size>0)
47{
48outStream.Write(writeData,0,size);
49}
50else
51{
52break;
53}
54}
55sm.Close();
56byte[]outArr=outStream.ToArray();
57outStream.Close();
58returnoutArr;
59}
60}
61}
然后我们在派生于类Page的页面把持基类中重载办法LoadPageStateFromPersistenceMedium()与SavePageStateToPersistenceMedium(ObjectviewState),代码以下:
1Load&SaveViewStateData#regionLoad&SaveViewStateData
2protectedoverrideobjectLoadPageStateFromPersistenceMedium()
3{
4//从本人注册的埋没域__SmartViewState中读取数据
5stringviewState=Request.Form["__SmartViewState"];
6byte[]bytes=Convert.FromBase64String(viewState);
7//挪用下面供应的静态办法CompressionHelper.DeCompressByte()来解压数据
8bytes=CompressionHelper.DeCompressByte(bytes);
9LosFormatterformatter=newLosFormatter();
10returnformatter.Deserialize(Convert.ToBase64String(bytes));
11
12}
13
14protectedoverridevoidSavePageStateToPersistenceMedium(ObjectviewState)
15{
16LosFormatterformatter=newLosFormatter();
17StringWriterwriter=newStringWriter();
18formatter.Serialize(writer,viewState);
19stringviewStateString=writer.ToString();
20byte[]bytes=Convert.FromBase64String(viewStateString);
21//挪用下面供应的静态办法CompressionHelper.CompressByte()来紧缩数据
22bytes=CompressionHelper.CompressByte(bytes);
23
24//注册一个新的埋没域__SmartViewState,你也能够本人界说
25this.RegisterHiddenField("__SmartViewState",Convert.ToBase64String(bytes));
26}
27#endregion
经由以上处置,web输入页面中的源代码就是型如:
<inputtype="hidden"name="__SmartViewState"value="H4sIAPtPoNwA/81ce1PbWJb/……
<inputtype="hidden"name="__VIEWSTATE"value=""/>
本来的埋没域"__VIEWSTATE"值为空,而取而代之的是我们本人注册的新的埋没域"__SmartViewState"来存储了经由紧缩后的字符串,如许以来,提速效果是分明的,分离我们的项目,象DG3G.COM的首页原ViewState串值约莫是28K,紧缩后为7K,而Acafa.com的首页原ViewState串值约莫是43K,紧缩后为8K。如许的处置仍是对照使人中意的。固然,假如你以为还不敷完全,你还能够把ViewState串存储在Session中,不外如许做,对服务器内存的压力将陡增(特别是会见量较年夜的时分),倡议仍是不要容易利用,假如你Web服务器内存有个10G、8G的,无妨尝尝。上面给出相干修正代码:
将上述LoadPageStateFromPersistenceMedium()办法体中的代码:
stringviewState=Request.Form["__SmartViewState"];
修正为:
stringviewState=Session["__SmartViewState"].ToString();
同时,将上述SavePageStateToPersistenceMedium()体中的代码:
this.RegisterHiddenField("__SmartViewState",Convert.ToBase64String(bytes));
修正为:
Session["__SmartViewState"]=Convert.ToBase64String(bytes);
最后,以上代码和计划均来自VS2003开辟理论,对VS2005是不是符合,自己不做任何答应,不外假如你能从以上计划中有所劳绩,我将感应非常的乐意。
你可以先看看这篇文章(软微学院生涯-三朝元老经验谈),打不开再跟我说。(我的意思是想让她自己先稍微了解一下到底现在各个方向学的工具以及以后要做的工具大概是什么,因为喜欢做什么样的事其实自己最清楚的)
小魔女 该用户已被删除
沙发
发表于 2015-1-19 22:25:38 | 只看该作者
现在主流的网站开发语言无外乎asp、php、asp.net、jsp等。
只想知道 该用户已被删除
板凳
发表于 2015-1-26 19:59:38 | 只看该作者
网页从开始简单的hmtl到复杂的服务语言,走过了10多个年头,各种技术层出不穷,单个的主流技术也在不断翻新的版本,现在分析下各种语言的区别、优势、劣势、开发注意事项!
冷月葬花魂 该用户已被删除
地板
发表于 2015-2-4 20:20:47 | 只看该作者
ASP.Net摆脱了以前ASP使用脚本语言来编程的缺点,理论上可以使用任何编程语言包括C++,VB,JS等等,当然,最合适的编程语言还是MS为.NetFrmaework专门推出的C(读csharp)。
愤怒的大鸟 该用户已被删除
5#
发表于 2015-2-10 06:36:53 | 只看该作者
HTML:当然这是网页最基本的语言,每一个服务器语言都需要它的支持,要学习,这个肯定是开始,不说了.
6#
发表于 2015-2-28 23:38:50 | 只看该作者
Servlet却在响应第一个请求的时候被载入,一旦Servlet被载入,便处于已执行状态。对于以后其他用户的请求,它并不打开进程,而是打开一个线程(Thread),将结果发送给客户。由于线程与线程之间可以通过生成自己的父线程(ParentThread)来实现资源共享,这样就减轻了服务器的负担,所以,JavaServlet可以用来做大规模的应用服务。
变相怪杰 该用户已被删除
7#
发表于 2015-3-10 10:40:42 | 只看该作者
提供基于组件、事件驱动的可编程网络表单,大大简化了编程。还可以用ASP.NET建立网络服务。
飘灵儿 该用户已被删除
8#
发表于 2015-3-17 06:12:34 | 只看该作者
Asp.net:首先来说,Asp.net和Asp没什么关系,看着像是升级版本什么的,其实没什么联系。Asp是脚本编程,用的是ASP语言,而ASP.net用的是C#语言,完全不同的东西。
海妖 该用户已被删除
9#
发表于 2015-3-23 23:20:51 | 只看该作者
以上是语言本身的弱点,在功能方面ASP同样存在问题,第一是功能太弱,一些底层操作只能通过组件来完成,在这点上是远远比不上PHP/JSP,其次就是缺乏完善的纠错/调试功能,这点上ASP/PHP/JSP差不多。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-5-18 09:23

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表