.net Viewstate无效长度错误

.net Viewstate无效长度错误,.net,asp.net,viewstate,.net,Asp.net,Viewstate,我一直在试图找出Base-64字符数组的无效长度和Base-64字符串中的无效字符的根源 这是一个很大的视图状态,因为我在其中存储了一大块数据,我不希望用户每三秒向数据库请求一次。因为它太大了(在某些情况下是4兆),所以我用Gzip压缩它,覆盖LoadPageStateFromPersistenceMedium()和SavePageStateToPersistenceMedium(ByVal pageViewState As Object),并创建一个自定义的viewstate 问题是,不时会发

我一直在试图找出Base-64字符数组的无效长度和Base-64字符串中的无效字符的根源

这是一个很大的视图状态,因为我在其中存储了一大块数据,我不希望用户每三秒向数据库请求一次。因为它太大了(在某些情况下是4兆),所以我用Gzip压缩它,覆盖LoadPageStateFromPersistenceMedium()和SavePageStateToPersistenceMedium(ByVal pageViewState As Object),并创建一个自定义的viewstate

问题是,不时会发生上述错误。我试图弄清这一点,因此在调用SavePageStateToPersistenceMedium时将初始视图状态长度存储在会话中,并将其与LoadPageStateFromPersistenceMedium中的新视图状态长度进行比较。我注意到Viewstate的长度被严重缩短,我想知道是什么原因导致了这种情况

我还注意到第二个字符串中出现了+个字符(我从每个字符串最右边的10个字符中选取一个,以查看最初是否添加了任何内容)。这种情况在一个用户身上肯定比在其他用户身上发生得更多,这要么表明他处理的数据存在问题,要么表明他与系统的物理连接(速度、软件、浏览器等)存在问题

有人有什么想法吗?我们也有很多刀片服务器为用户提供服务,所以我想知道用户是否可以从一个刀片服务器推送到另一个刀片服务器,但我需要检查一下


我还听说这可能与渲染有关,但我认为viewstate是在渲染之前加载的?

正如我在上面的评论中所建议的,您应该分析、理解并决定是否需要在每次页面加载时来回发送该数量的数据;如果它属于页面并且被某些用户控件使用,或者如果它仅由您在某种手工制作的缓存机制中的代码中使用

我不会重复你能在网上找到的所有文章,可供选择的方法是查看仅与该页面和每个请求相关的少量数据的ViewState、按用户缓存的会话和按应用程序缓存的缓存


阅读本文了解更多详细信息:

首先,不应该在ViewState中存储大块数据。这不是ViewState的设计目的,它会破坏页面的性能

您应该始终尝试限制数据库的点击次数,但不要以牺牲其他一切为代价。通过强制web服务器发布和服务每个请求的5MB页面,您给web服务器带来了巨大的压力


如果数据是特定于用户的,则将其存储在会话中。如果数据不是特定于用户的,那么它可能非常适合缓存。不管是什么情况,都不要将其置于ViewState。将数据移动到会话应该可以解决这个问题

您确定存储在其中的数据必须在页面渲染时可用吗?根据您的描述,如果您从代码隐藏中设置并获取此数据,并且不需要呈现控件的页面布局,那么缓存也可以。ViewState应该很小,并且只与页面相关。更大的数据块可以存储在会话中(如果是每个用户),也可以存储在缓存中(如果是每个应用程序)。@DavidePiras我的想法完全相同。我认为使用缓存会更快更干净。而且,它有很大的副作用,可以解决ViewState问题。是的,但请记住,缓存是应用程序范围的,如果您存储的数据对于每个连接的用户都不同,请使用会话。缓存肯定是一个选项,但这是每个用户的,我希望避免因做出改变而产生的复杂情况和计算。该页面目前稳定且性能良好,过去非常麻烦。上述错误大约每1000-1500次回发仅发生一次。可能是因为在再次回发页面之前,ViewState尚未完成下载。如果没有副作用,您无法在5MB的ViewState上运行。缓存和会话仍然存在必须存储的问题。我还是想看看是否可以先弄清异常问题的根源,因为正如我所说的,除此之外,该页面的性能非常好,过去没有。另外,如果要使用会话,我还需要进行压缩,因为数据集的正常大小是4MB。@user676767:您的错误太大了,这很痛苦。没有人会支持在ViewState中存储5MB数据集的想法。这完全是胡说八道。>缓存和会话仍然存在必须存储的问题。<在会话状态下存储微不足道的4Mb的开销与通过有线传输5Mb的开销相比是微不足道的。虽然您的应用程序似乎在CPU利用率为0%的情况下运行,但这是因为您的客户机受I/O限制,等待页面加载!抱歉,我可能误解了压缩ViewState的工作原理,但我认为只有压缩后的大小才算上发布到服务器的大小。在压缩之前大约是3-4MB。压缩后的大小约为120KB(刚计算出来的大小)。不过就CPU而言,我不知道处理这个问题的成本有多高。然而,页面上的响应非常快。我在上面留下了另一条评论。我正在压缩viewstate,然后再将其发回。每一个请求都会减少到几百KB。如果我使用会话变量,那么我认为这些变量存储在服务器上?那么,与压缩和解压缩相关的请求成本有多高呢?您似乎仍然没有抓住要点。即使在压缩之后,5MB数据集也可能是3MB,这是乐观的。您的ViewState不应超过100KB,即使这样也会使其变大。默认InProc会话存储在服务器的内存中,更适合存储这样大的对象。如果您可以将其存储在缓存中,这将非常理想,但由于数据是用户指定的