11

我不断听到“Viewstate Chunking”这个词。什么是 Viewstate 分块?

以及它是如何为 ASP.NET 页面工作的?

4

2 回答 2

16

当页面中的 ViewState 变得非常大时,可能会出现问题,因为某些防火墙和代理会阻止访问包含巨大 ViewState 大小的页面。为此,ASP.NET 引入了 ViewState Chunking 机制。因此,ASP.NET 可以使用 web.config 部分中的 MaxPageStateFieldLength 属性将 ViewState 的单个隐藏字段拆分为多个。

当 MaxPageStateFieldLength 属性设置为正数时,发送到客户端浏览器的视图状态被分成多个隐藏字段。

将 MaxPageStateFieldLength 属性设置为负数(默认值)表示不应将视图状态字段分成块。将 MaxPageStateFieldLength 设置为较小的数字可能会导致性能下降。

之前的示例 ViewState:

<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE"value="/wEPDwUKLTk2Njk3OTQxNg9kFgICAw9kFgICCQ88KwANAGQYAQUJR3Jp
ZFZpZXcxD2dk4sjERFfnDXV/hMFGAL10HQUnZbk=" />

然后在 web.config 中设置:

<pages maxPageStateFieldLength="40">

示例 ViewState 之后:

<input type="hidden" name="__VIEWSTATEFIELDCOUNT" id="__VIEWSTATEFIELDCOUNT"value="3" />
<input type="hidden" name="__VIEWSTATE"
id="__VIEWSTATE" value="/wEPDwUKLTk2Njk3OTQxNg9kFgICAw9kFgICCQ88" />
<input type="hidden" name="__VIEWSTATE1"
id="__VIEWSTATE1" value="KwANAGQYAQUJR3JpZFZpZXcxD2dk4sjERFfnDXV/" />
<input type="hidden" name="__VIEWSTATE2"
id="__VIEWSTATE2" value="hMFGAL10HQUnZbk=" /> 

希望对你有帮助!

于 2012-09-05T19:27:50.180 回答
4

来自ASP.NET 状态管理中的新增功能 - MSDN

如果视图状态数据量变得太大,视图状态分块会自动将数据拆分成块,并将数据放入多个隐藏表单字段中。

为什么我们需要 Viewstate Chunking?

这是ViewState Overivew 的摘录 - MSDN

另一个重要的考虑因素是,如果隐藏字段中的数据量变大,某些代理和防火墙将阻止访问包含它们的页面。因为最大数量会随着不同的防火墙和代理实现而变化,所以大的隐藏字段可能会导致零星的问题。为帮助避免此问题,如果 ViewState 属性中存储的数据量超过页面的MaxPageStateFieldLength属性中指定的值,页面会将视图状态拆分为多个隐藏字段,以将每个单独字段的大小减小到防火墙拒绝的大小以下。

于 2012-05-02T12:43:38.027 回答