ASP.NET 广泛用于处理同时处理数百万用户的高流量 Web 应用程序。组织跨负载平衡的 Web 场部署这些应用程序。ASP.NET 的一个重要方面是视图状态,这是一种在客户端和 Web 服务器之间的多个 HTTP 请求之间存储页面、控件和自定义值的机制。但是,按预期有效利用视图状态可能会影响性能和带宽。
关键精华
消除有效载荷膨胀: 标准 ASP.NET 视图状态将页面数据存储在隐藏的 Base64 字符串中,该字符串可能超过 100KB,从而减慢响应时间; NCache 将其替换为一个很小的 40 字节 GUID。
降低云端出口成本: 通过将大量的视图状态数据保存在服务器上,并且只向浏览器发送令牌,可以显著降低 Azure 或 AWS 部署中的带宽使用量和相关成本。
增强 Web 服务器集群可扩展性: 在负载均衡环境中,分布式缓存就像 NCache 确保视图状态在所有服务器节点上同步,防止出现“视图状态 MAC 验证”错误。
提升应用程序安全性: 敏感表单数据安全地存储在服务器端缓存中,而不是暴露在客户端浏览器 HTML 中。
低代码实现: 优化视图状态 NCache 它无需对您的应用程序进行任何逻辑更改。只需要进行少量配置。 web.config中 和 app.browser 文件。
什么是 ASP.NET 视图状态?
此强大功能可跟踪网页上的用户输入和选择,即使在重新加载或刷新后也是如此。它允许 Web 应用程序保留用户输入和选择,而无需服务器端会话。视图状态值存储在页面上的隐藏字段中,并编码为 Base64 字符串。它看起来像这样:
|
1 2 3 4 |
<input id="__VIEWSTATE" type="hidden" name="__VIEWSTATE" value="/wEPDwUJNzg0MDMxMDA1D2QWAmYPZBYCZg9kFgQCAQ9kFgICBQ9kFgJmD2QWAgIBD xYCHhNQcm2aW91c0NvbnRyb2xNb2RlCymIAU1pY3Jvc29mdC5TaGFyZVBvaW50Lld lYkNvbnRyb2xzLlNQQ29udHJbE1vZDA1XzRlMjJfODM3Y19kOWQ1ZTc2YmY1M2IPD 2…==" /> |
ASP.NET ViewState 的挑战
虽然视图状态非常有用,但它可能会变得非常庞大,尤其是在包含复杂控件(例如网格视图)的应用程序中。视图状态的增大导致 HTTP 请求和响应也随之增大,由于 Base64 序列化开销和 HTTP 有效负载增大,应用程序的响应速度会因此变慢。
另一个缺点是带宽使用量增加,这会影响网络延迟,并显著提高 Azure 或 AWS 等云部署中的出口流量成本。例如,如果每个 HTTP 请求都会增加 60-100 KB 的视图状态数据,那么乘以事务总数就会迅速增加成本。最后,将敏感数据作为视图状态的一部分发送会带来安全风险,因此必须进行加密——而加密过程可能会影响性能。
为什么要缓存 ASP.NET 视图状态?
为了应对这些挑战,将 ASP.NET 视图状态缓存在 Web 服务器上并为其分配一个 GUID 作为键值是一种非常有效的方法。服务器将此 GUID 以隐藏字段的形式发送给浏览器,浏览器在下一个 HTTP 请求中将其返回。然后,服务器使用该 GUID 从缓存中获取相应的视图状态。这种方法减少了发送到浏览器的有效负载,从而显著提高了响应速度并大幅降低了带宽成本。
以下对比突出了将视图状态从客户端迁移到分布式缓存的方式,例如 NCache 从根本上改变应用程序的资源配置:
| 特性 | 标准 ASP.NET 视图状态 | 缓存视图状态 NCache |
|---|---|---|
| 客户端有效载荷 | 大文件(通常超过 100KB) | 最小(约 40 字节) |
| 带宽消耗 | 高(已转发所有请求) | 极低(仅限 GUID 交易所) |
| 安全风险 | 高(在隐藏领域中暴露) | 低(数据保留在安全缓存中) |
| 服务器性能 | 较低(由于大量序列化) | 优化(快速内存检索) |
配置 NCache 用于 ASP.NET 视图状态缓存
如果您的 ASP.NET 应用程序在负载平衡的 Web 场中运行,则必须使用分布式缓存。像 ASP.NET Cache 这样的独立缓存不起作用。为此, NCache 是一个企业级分布式缓存,提供 ASP.NET 视图状态缓存模块。实现它需要最少的代码更改——只需对您的 ASP.NET web.config 文件进行小幅修改。请按照以下步骤进行设置。
- 在您的 ASP.NET 应用程序中的 App_browsers 目录下创建一个 app.browser 文件。将您的页面适配器添加到 app.browser 文件中,如下所示。
12345<browser refID="Default"><controlAdapters><adapter controlType="System.Web.UI.Page"adapterType="Alachisoft.NCache.Adapters.PageAdapter"/></controlAdapters></browser> - 然后在 web.config 文件的编译部分添加以下程序集引用。
1234567<compilation defaultLanguage="C#" debug="true"><assemblies><add assembly="Alachisoft.NCache.Adapters,Version=1.0.0.0,Culture=neutral,PublicKeyToken=cff5926ed6a53769"/></assemblies></compilation> - 在 web.config 文件中注册您的配置部分。
1234567<configSections><sectionGroup name="ncContentOptimization"><section name="settings"type="Alachisoft.NCache.ContentOptimization.Configurations.ContentSettings"allowLocation="true" allowDefinition="Everywhere"/></sectionGroup></configSections> - 在 web.config 文件(上面已注册)中指定配置部分的设置。
12345678910<ncContentOptimization><settings enableMinification="true"enableViewstateCaching="true"groupedViewStateWithSessions="true"viewstateThreshold="0"enableTrace="true"><cacheSettings cacheName="mycache"><expiration type="Sliding" duration="300"/></cacheSettings></settings></ncContentOptimization> - 最后,在 web.config 的 HttpHandlers 部分中注册 HTTP 处理程序,如下所示。
12345<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"/>
配置后 NCache,您可以在应用程序中看到View State标签,如下所示。
|
1 2 3 4 5 6 |
<input type="hidden" name="__NCPVIEWSTATE" id="__NCPVIEWSTATE" value="vs:cf8c8d3927ad4c1a84da7f891bb89185"/> <input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value=""/> |
请注意,ASP.NET View State 中添加了另一个隐藏标签。这个新标签包含一个唯一键,该键链接到存储在分布式缓存中的 View State。当应用程序服务器需要检索 View State 时,它可以快速从缓存中访问,从而显著提升性能。
结语
通过缓存 ASP.NET 视图状态 NCache,您可以显著改善应用程序的响应时间,同时大幅降低带宽成本。这个简单而有效的解决方案显著提高了 ASP.NET 应用程序的整体性能,使其更高效、更节省资源。通过试用 NCache 自己动手制作 ASP.NET View State 模块吧!
常见问题
问:为什么需要分布式缓存而不是本地 ASP.NET 缓存?
答:标准的 ASP.NET 缓存仅限于单个服务器。在负载均衡的 Web 服务器集群中,如果回发请求到达的服务器与原始请求的服务器不同,则本地缓存中将不会包含视图状态。 NCache 提供一个分布式环境,其中场中的所有服务器共享相同的视图状态数据。
问:这次的目的是什么 视图状态阈值 设置?
答: 视图状态阈值 (以 KB 为单位)允许您设置缓存的最小大小限制。如果页面的视图状态小于此阈值,则页面将照常保留在客户端。这确保您仅将缓存资源用于真正导致性能瓶颈的“大型”视图状态。
问:缓存视图状态是否需要对我的现有 .NET 代码进行任何更改?
答:不。集成是在提供商层面处理的。通过注册 Alachisoft.NCache适配器 在您的 web.config中 和 app.browser 文件, NCache 自动拦截视图状态生命周期,无需您重写页面逻辑。
问:浏览器如何知道要从缓存中检索哪个视图状态?
A: NCache 替换其中庞大的 Base64 字符串 __VIEWSTATE 隐藏字段,其中包含一个唯一的、轻量级的 GUID。在回发时,浏览器会将此 GUID 发送回服务器。 NCache 用作密钥,可立即从集群中获取原始数据。
问:我可以将视图状态过期与用户会话关联起来吗?
A:是的。通过设置 groupedViewStateWithSessions=”true” 在您的配置中, NCache 当用户的 ASP.NET 会话过期时,可以自动清除用户缓存的视图状态,从而帮助优化缓存集群中的内存使用情况。







您可以使用 NCache 用于 Azure 存储 Microsoft Azure ASP.NET 应用程序的 ASP.NET 会话状态。 这是一个解释 Microsoft Azure 会话存储选项及其原因的博客 NCache 在 Microsoft Azure 的所有可用选项中,for Azure 是最好的。
https://20.200.20.123:86/storing-asp-net-session-state-in-a-microsoft-azure-distributed-cache/
有人成功使用 Windows Azure 缓存(预览版)来处理会话状态吗?