利用 View State 缓存优化 ASP.NET 性能 【已翻译100%】

  1. 云栖社区>
  2. 博客>
  3. 正文

利用 View State 缓存优化 ASP.NET 性能 【已翻译100%】

青衫无名 2017-06-02 11:55:00 浏览1224
展开阅读全文

简介

ASP.NET的视图浏览机制提供了客户端的管理方式.它能够保存请求过程中的所有数据. 这对于无状态显示的协议编程如HTTP提供了方便.

ASP.NET的 View State被保存在页面上隐藏的Base64字符串中, 它记录了客户端到服务器的请求以及服务端到客户端的回应信息.

<input id="__VIEWSTATE" type="hidden"

name="__VIEWSTATE"
value="/wEPDwUJNzg0MDMxMDA1D2QWAmYPZBYCZg9kFgQCAQ9kFgICBQ9kFgJmD2QWAgIBDxYCHhNQ
cm2aW91c0NvbnRyb2xNb2RlCymIAU1pY3Jvc29mdC5TaGFyZVBvaW50LldlYkNvbnRyb2xzLlNQQ29u
dHJbE1vZGUsIE1pY3Jvc29mdC5TaGFyZVBvaW50LCBWZXJzaW9uPTEyLjAuMC4wLCBDdWx0dXJlPW5l
dXRyWwsIFB1YmxpY0tleVRva2VuPTcxZTliY2UxMTFlOTQyOWMBZAIDD2QWDgIBD2QWBgUmZ19lMzI3
YTQwMF83ZDA1XzRlMjJfODM3Y19kOWQ1ZTc2YmY1M2IPD2RkZAUmZ18yNDQ3NmI4YV8xY2FlXzRmYTV
fOTkxNl8xYjIyZGYwNmMzZTQPZBYCZg8PZBYCHgVjbGFzcwUbbXMtc2J0YWJsZWFsdCBtcy1zYnRhYm
xFlOTQyOWMBZAIDD2YjIyZGYjIyZGYjIyZGlYkNvbnRyb2xzLlNQQ29YkNvbnRyb2xzLlNQQ2UxMTFl
OTQyOWMBZAIDD2QWDgIBD2QWBgUmZ19lMzI3YTQwMF83ZDA1XzRlMjJfODM3Y19kOWQ1ZTc2YmY1M2IPD...==" />

图 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服务器更优的性能和伸缩性.

image

图 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>

在服务端缓存 ASP.NET View State的好处

在服务端使用NCache缓存 ASP.NET View State 的好处如下 .

1.提高ASP.NET 性能 现在只需要发送一个小小的token而无需viewstate的原生数据. 这能减少数据量提升性能.

2.降低带宽花费: 数据量小了也节省了很多带宽流量.能省不少钱

3.安全性: 现在ASp.NET的viewstate字符串无需发送到浏览器端了,也就没有安全隐患了.

4.ASP.NET View State 存储更快速更具有延展性: NCache 是很快速具有延展性的分布式缓存.这就解决了ASP.NET的瓶颈问题.

5.ASP.NET View State可靠性提高: NCache 会智能复制相关的数据.意味着即使缓存服务器当掉,也不会丢失先关数据

NCache中的 ASP.NET View State高级特性

NCache提供了很多管理ASP.NETviewstate高级特性.列表如下

1.最小单元: NCache可以标注 ASP.NET View State的最小数据单元. 小于这一熟知的数据不会保存. 这样就只会保存重要的数据.

2.ASP.NET View State连接会话状态: 你可以连接viewstate到当前的会话上.这样会话结束后,缓存数据就会消失

3.页面数据上限单元: 你可以控制好在一个先进先出环境中页面将要保存的数据最大单元数. 这样只会保存到最新的数据单元. 这就更好的管理了内存的使用情况,只提供给最需要的数据保存.

4.会话数据上限单元: 和页面类似,也可以指定会话的数据单元上限. 这就保存的是最近的数据单元.

5.页面和会话级别设置: 可以分别设置每个页面或会话属性.亦或是全部使用相同的配置

结论
正如你所见,缓存ASP.NETviewstate属性提供了很多很棒的特性,也提升了应用的性能. 它也帮助你节省了不少带宽费用. 最重要的是,解决了数据发送至浏览器的安全问题.

如果你在使用 ASP.NET View State 最好将其缓存至服务端. 为此你也最好看看Ncache.更详细的介绍在这http://www.alachisoft.com

作者

Iqbal Khan 是 Alachisoft (http://www.alachisoft.com)的技术专家. Alachisoft 为.NET平台提供分布式缓存NCache. Iqbal1990年从印第安纳大学获得计算机科学硕士学位,可以通过邮箱联系他 iqbal@alachisoft.com.

网友评论

登录后评论
0/500
评论
青衫无名
+ 关注