简介ASP.NET的视图浏览机制提供了客户端的管理方式.它能够保存请求过程中的所有数据. 这对于无状态显示的协议编程如HTTP提供了方便. ASP.NET的 View State被保存在页面上隐藏的Base64字符串中, 它记录了客户端到服务器的请求以及服务端到客户端的回应信息. <input id="__VIEWSTATE" type="hidden"name="__VIEWSTATE"value="/wEPDwUJNzg0MDMxMDA1D2QWAmYPZBYCZg9kFgQCAQ9kFgICBQ9kFgJmD2QWAgIBDxYCHhNQcm2aW91c0NvbnRyb2xNb2RlCymIAU1pY3Jvc29mdC5TaGFyZVBvaW50LldlYkNvbnRyb2xzLlNQQ29udHJbE1vZGUsIE1pY3Jvc29mdC5TaGFyZVBvaW50LCBWZXJzaW9uPTEyLjAuMC4wLCBDdWx0dXJlPW5ldXRyWwsIFB1YmxpY0tleVRva2VuPTcxZTliY2UxMTFlOTQyOWMBZAIDD2QWDgIBD2QWBgUmZ19lMzI3YTQwMF83ZDA1XzRlMjJfODM3Y19kOWQ1ZTc2YmY1M2IPD2RkZAUmZ18yNDQ3NmI4YV8xY2FlXzRmYTVfOTkxNl8xYjIyZGYwNmMzZTQPZBYCZg8PZBYCHgVjbGFzcwUbbXMtc2J0YWJsZWFsdCBtcy1zYnRhYmxFlOTQyOWMBZAIDD2YjIyZGYjIyZGYjIyZGlYkNvbnRyb2xzLlNQQ29YkNvbnRyb2xzLlNQQ2UxMTFlOTQyOWMBZAIDD2QWDgIBD2QWBgUmZ19lMzI3YTQwMF83ZDA1XzRlMjJfODM3Y19kOWQ1ZTc2YmY1M2IPD...==" /> 图 1: ASP.NET View State示例 ASP.NET View State面临的问题ASP.NET View State有一些问题你得明了. 一旦这些问题解决了,就能更好的使用这一特性.具体如下 1. ASP.NET View State数据量较大首先说的是,viewstate的数据量很大,尤其是页面包含大量的控制件或是富文本内容.这在客户端和服务器往来通信中就会产生很多数据. 就是因为这一原因,它会造成你的ASP.NET应用性能下降.在使用过程中就能体会到这一点 另一个问题就是带宽占用. 这就关系到钱的问题了,如果viewstate的带宽上限是10m/s,当面令数百万的请求处理时就会显得力不从心了. 2. ASP.NET View State 有安全隐患ASP.NET View State在发送机密数据到客户端时会有泄密危险. 数据有可能被截获. 当然可以再次加密后发送,但还是会影响到性能. ASP.NET View State 的应对方法解决 ASP.NET View State上述问题的一个方法就是给每一个数据加上唯一标示(或是ID).之后通过这个标示来查找相应的回复. 这么做的原理就是,viewstate只会把数据保存到服务端而不会放在浏览器. 所以对于浏览器来说不管是标示还是ID都无所谓. 下面就是个例子. <input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="vs:cf8c8d3927ad4c1a84da7f891bb89185" /> 图2: 字符串中的token 但如果在集群的环境上使用viewstate,下一次的请求可能会发送到另一台服务器上. 因此,需要把数据保存到所有服务器都能访问到的公共存储机上. 保存数据的最好地方就是分布式的缓存区. 这样,不但能实现公用的服务器存储,更能体现出相比SQLserver服务器更优的性能和伸缩性. 图 3: 分布式缓存 ASP.NET View State NCache 是.NET平台一个分布式缓存. 它也能帮助解决上面提到的viewstate的问题. NCache怎么用 ?NCache 无需更改ASP.NET应用的代码就能实现分布式缓存. 可以按照下面的步骤来实现. Step 1: 在App_browsers 创建app.browser文件. 在app.browser添加page adapters : File: App_browsers\app.browser<browser refID="Default"> <controlAdapters> <adapter controlType="System.Web.UI.Page" adapterType="Alachisoft.NCache.Adapters.PageAdapter" /> </controlAdapters></browser> Step 2: 在web.config 文件中添加相关引用: File: web.config<compilation defaultLanguage="c#" debug="true" targetFramework="4.0"> <assemblies> <add assembly="Alachisoft.NCache.Adapters, Version=1.0.0.0, Culture=neutral, PublicKeyToken=CFF5926ED6A53769"/> </assemblies></compilation> Step 3: 在 web.config 注册NCache. File: web.config<configSections> <sectionGroup name="ncContentOptimization"> <section name="settings" type="Alachisoft.NCache.ContentOptimization.Configurations.ContentSettings" allowLocation="true" allowDefinition="Everywhere"/> </sectionGroup></configSections> Step 4: 在 web.config 文件中修改相关配置(上面注册过的部分). 它们控制 NCache ASP.NET View State 缓存功能. File: web.config<ncContentOptimization> <settings viewstateThreshold="12" enableViewstateCaching="true" enableTrace="false" groupedViewStateWithSessions="false"> <cacheSettings cacheName="myCache" maxViewStatesPerSession="3"> <expirationtype="Absolute" duration="1" /> </cacheSettings> </settings></ncContentOptimization> Step 5:最后在web.config 注册 HTTP handler: File: web.config<httphandlers> <add verb="GET,HEAD" path="NCResource.axd" validate="false" type="Alachisoft.NCache.Adapters.ContentOptimization.ResourceHandler, Alachisoft.NCache.Adapters, Version=1.0.0.0, Culture=neutral, PublicKeyToken=cff5926ed6a53769"/></httphandlers> |