在视图状态中存储数据是否会减慢页面加载速度

本文关键字:加载 速度 视图状态 存储 数据 是否 | 更新日期: 2023-09-27 18:30:31

我已经将我的数据集存储在视图状态中(因为我需要过滤不同客户端单击的数据并显示数据),但我觉得页面加载需要很多时间,即使是没有任何代码可执行的 checbox 检查事件(使用自动回发)也需要将近 2-3 秒。

这仅仅是因为视图状态数据吗,如果是这样,是否有任何替代方法可以完成我的任务? 我需要在客户端事件上快速显示数据,所以我一直在使用视图状态。 任何解决方法都会有所帮助。

在视图状态中存储数据是否会减慢页面加载速度

如上所述@Tushar,ViewState 不是您想要存储大量数据的地方。 它实际上只是为了在往返之间保留控件的状态,并且确实可能导致应用性能不佳。

相反,您应该查看以下服务器托管选项:

应用程序状态 - 用于存储所有用户之间共享的数据。使用服务器内存。

会话状态 - 用于存储特定于用户会话的数据。还使用服务器内存。 数据可以通过应用程序重启以及整个 Web 园或服务器场保留。来自 MSDN 的详细信息:http://msdn.microsoft.com/en-us/library/z1hkazw7.aspx

这些方法的最大缺点是内存管理,因为这两个选项都会消耗服务器内存,并保留数据,直到重新启动某种类型或会话被丢弃。 因此,这些方法并不总是可以很好地扩展。

此外,下面是一篇 MSDN 文章,讨论了状态管理的各种 .net 方法,每种方法都有优缺点:

第三种选择是通过使用 .NET 缓存库、构建自己的和/或使用第三方缓存服务器/库来实现缓存策略。使用缓存的好处是,数据在任何给定的指定时间量后自动过期。 但是,在 Web 园或服务器场环境中工作时会引入复杂性。

要记住的最重要的事情是,上述任何策略都需要在管理/共享数据方面进行一些规划和考虑。

如果在 ViewState 中存储大量数据,则会注意到性能问题。 尽管 ViewState 实际上适用于"此页面",而会话适用于"此会话",但您将达到 ViewState 大小的限制,此时会话最终的性能要好得多。

值得注意的是,您可能遇到了其他类型的问题,而不仅仅是视图状态的问题(即您的数据库查询可能需要很长时间并且可能会被缓存)。

ViewState 使页面稍微变大,因为页面的 HTML 中嵌入了额外的数据来保存序列化的 ViewState。 该额外大小是否会导致加载问题取决于连接速度,以及视图状态相对于页面其余部分的大小。

ViewState 随每个 HTTP 请求(因此包括自动回发)一起发送回服务器。 同样,这是否会导致明显的性能问题取决于视图状态大小和连接速度。

在宽带(ish)连接上,人们可以在典型页面中找到ViewState数据量,您不会看到2-3秒的额外处理时间。

诊断

使用浏览器中的开发人员工具(在 IE 中,按 F12)。 您可以监控 Web 请求,包括发送和接收的确切标头和正文。 您还可以查看每个 HTTP 请求的时间。 如果视图状态不是很大(可能不超过 1-2K),并且您的连接速度不太慢,那不是您的罪魁祸首。

选择

可以将状态完全

保存在服务器端,也可以将任何较大的状态项完全放在服务器上。 您可以使用 Ajax 请求来处理依赖于该状态的页面事件。

不要多次从数据源加载数据,而只加载一次。 其他答案涉及访问数据。 我遇到过每次回发时加载数据的实例。

string myString;
public string MyString
{
    get
    {
        // If there is already data in "myString", do not load it again!
        if (this.ViewState["myData"] == null)
        {
             // Load data one time
             this.ViewState["myData"] = "Hello";
        }
        return this.ViewState["myData"] as string;
    }
}

ViewState 减慢页面速度的程度取决于您拥有的视图状态。我继承了生成超过一兆字节视图状态的页面,并看到 Web 服务器花费 10 秒来处理视图状态。如果您不想重写应用程序并且需要大量的视图状态,则需要研究保存/还原视图状态的替代策略。将 ViewState 保存到数据库甚至普通文件要快得多 - 不必在每个请求时将视图状态流式传输到客户端/从客户端流式传输视图状态。

不过,最好的策略是首先避免视图状态。

只是

想我应该补充一点,有些控件只是视图状态猪,有些网格对于视图状态消耗来说很糟糕。

您可以查看

页面的来源并获取ViewState值,并使用以下网址中的在线ViewState decoder来检查页面的ViewState字段中存储的值有多大:

http://ignatu.co.uk/ViewStateDecoder.aspx

如果您发现您的视图状态具有较大的存储值,那么您应该找到存储Dataset的替代方案。

无论如何,您应该避免将数据集放入视图状态中。