当前位置: 首页 > 编程语言 > C#

如何删除或压缩您的asp.net视图状态分享

时间:2023-04-10 15:04:25 C#

C#学习教程:如何删除或压缩你的Asp.netViewState查看状态,我认为值得分享它是如何完成的。基本上,我希望这个问题对所有用于缩小/压缩/删除视图状态的解决方案都是开放的。第一个简单选项,使用内置的SessionPageStatePersister类。这样做是将视图状态保留在服务器的会话中,而不是将其发送到客户端。然而,它仍然发送到较小的视图状态,所以它不是所有的玫瑰:使用System.Web.UI;...以下内容进入您的Page类(例如您的.aspx.cs)...PageStatePersisterpageStatePersister;protectedoverridePageStatePersisterPageStatePersister{get{//与MSDN文档中的示例不同,我们不能简单地返回一个新的PageStatePersister//每次调用此属性,因为它会导致问题returnpageStatePersister??(pageStatePersister=newSessionPageStatePersister(this));这种方法将特别大的回发从100k缩小到80k。不是很好,但是一个好的开始。切换到ASP.NETMVC!没有视图状态!另一个更好的选择是推出您自己的PageStatePersister。这是我的,收到http://aspalliance.com/72的启动:usingSystem.Web.UI;...在您的页面类中:PageStatePersisterpageStatePersister;protectedoverridePageStatePersisterPageStatePersister{get{//与MSDN文档中的示例不同,我们不能简单地返回一个新的PageStatePersister//每次调用此属性,因为它会导致问题returnpageStatePersister??(pageStatePersister=newBetterSessionPageStatePersister(this));}}...在您的BetterSessionPageStatePersister.cs中://////此类允许将视图状态保留在服务器端,以便回发尽可能小。///它类似于内置的“SessionPageStatePersister”,但它产生更小的回发,///因为SessionPageStatePersister仍然在回发中留下一些视图状态(可能它留下控制状态)///。///classBetterSessionPageStatePersister:PageStatePersister{publicBetterSessionPageStatePersister(Pagepage):base(page){}常量字符串ViewStateFieldName="__VIEWSTATEKEY";conststringViewStateKeyPrefix="ViewState_";conststringRecentViewStateQueue="ViewStateQueue";constintRecentViewStateQueueMaxLength=5;publicoverridevoidLoad(){//此视图状态的缓存键存储在一个隐藏字段中,因此获取它stringviewStateKey=Page.Request.Form[ViewStateFieldName]asstring;//使用键获取视图状态数据以进行查找if(viewStateKey!=null){Pairp=(Pair)Page.Session[viewStateKey];ViewState=p.First;ControlState=p.Second;}}publicoverridevoidSave(){//给这个viewstate一个随机keystringviewStateKey=ViewStateKeyPrefix+Guid.NewGuid().ToString();//存储视图和控件状态Page.Session[viewStateKey]=newPair(ViewState,ControlState);//将视图状态的键存储在隐藏字段中,因此在回发时我们可以从缓存中获取它Page.ClientScript.RegisterHiddenField(ViewStateFieldName,viewStateKey);//一些整理:跟踪该用户的X个最近的视图状态,并删除旧的varrecent=Page.Session[RecentViewStateQueue]asQueue;if(recent==null)Page.Session[RecentViewStateQueue]=recent=newQueue();最近入队(viewStateKey);//添加这个新的,以便稍后将其删除while(recent.Count>RecentViewStateQueueMaxLength)//如果队列中有很多,则删除旧的Page.Session.Remove(recent.Dequeue());首先了解什么是最重要的视图,以及为什么首先需要它之后,只需注意应用程序为您做什么,并记住附加UseViewState="false"到通常使用viewstate所有元素。现在要记住它为什么有用,您肯定需要更频繁地手动检索它。所有工具的时间和地点,是吗?完全摆脱它:protectedoverrideobjectLoadPageStateFromPersistenceMedium(){returnnull;}protectedoverridevoidSavePageStateToPersistenceMedium(objectviewState){}你可以试试看!您可以通过派生System.Web.Page并使用一个小技巧覆盖PageStatePersister属性来劫持页面状态的序列化:privatePageStatePersister_pageStatePersister=null;protectedoverridePageStatePersisterPageStatePersister{get{return_pageStatePersister??(_pageStatePersister=newPersistState(this));完成后,您可以从HiddenFieldPageStatePersister派生一个新实例,并从那里使用反射来更改持久性实现:PageStatePersister).GetField("_stateFormatter",BindingFlags.NonPublic|BindingFlags.Instance|BindingFlags.SetField);f.SetValue(这个,这个);}objectIStateFormatter.Deserialize(stringserializedState){BinaryFormatterf=newBinaryFormatter();使用(GZipStreamgz=newGZipStream(newMemoryStream(Convert.FromBase64String(serializedState)),CompressionMode.Decompress,false))returnf.Deserialize(gz);}stringIStateFormatter.Serialize(objectstate){BinaryFormatterf=newBinaryFormatter();使用(MemoryStreamms=newMemoryStream()){使用(GZipStreamgz=newGZipStream(ms,CompressionMode.Compress,true))f.Serialize(gz,state);返回Convert.ToBase64String(ms.ToArray());当心这个只是一个探索性的例子上面的代码是一个安全风险,因为它没有对有效负载进行签名和加密,因此容易受到任何试图对网站造成伤害的人的攻击。如果对安全性、加密和.Net序列化没有扎实和完整的理解,请不要使用此代码。正如其他人所说,真正的问题是开始使用页面状态。对于大量使用页面状态的编写糟糕的ASP.NET应用程序,最简单的解决方案是建立状态服务器并使用SessionPageStatePersister。我们公司使用的一种方法是通过删除runat="server"调用来删除大部分方法。然后我们使用javascript,或者一个很好的javascript库,比如jQuery或Prototype,通过对服务器的ajax调用来填充HTML元素。我的老板在一个拥有几兆字节视图状态数据的网站上做了很多工作。他使用了上面的方法并且它“在没有视图状态的情况下工作正常”。以上就是C#学习教程:如何删除或压缩你的asp.net视图状态共享的所有内容。如果对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文来自网络收集,不代表作品如涉及侵权,请点击右边联系管理员删除。如需转载请注明出处: