65.9K
CodeProject 正在变化。 阅读更多。
Home

C# ViewState 管理/存储 - 四个位置!

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.30/5 (7投票s)

2007年11月5日

5分钟阅读

viewsIcon

52499

downloadIcon

284

在本文中,我讨论了 PageStatePersister,并详细介绍了 ViewState 在以下四个位置之一的存储:Session、Application、AppGlobals 和服务器缓存。

引言

从 SEO 的角度来看,页面大小以及页面上文本的位置都很重要。在使用 VS .Net 创建网站时,我们会得到一个 ViewState 变量,在某些情况下,它会占用页面顶部的大量空间。这实际上可能会稀释给定网页内容的权重。就页面大小而言,一些搜索引擎只缓存前 120kb 的数据。

本项目旨在寻找另一个存储 ViewState 的位置。在这种情况下,我提供了四个存储位置:

  • Session
  • Application
  • AppGlobals
  • 缓存

通过创建一个基类,在所有类中引用它,并在 Web.config 的 appSettings 键中选择存储位置,这可以在任何 C# 项目中轻松实现。然而,缺少的是 SQL Server 存储位置。我非常乐意整合任何此类实现!

在完全深入代码之前,我想首先讨论为什么它很重要,以及 PageStatePersister 实际上并没有帮助。


背景

现在来说明减少 ViewState 参数大小的重要性。我最初编写此代码/将其整合在一起的原因与 Oleg Sobol 在这篇 (ViewStateProvider_Net2_0.asp) 文章中的原因略有不同,但我认为它们同样适用,但我们的核心原因是一样的——ViewState 大小——它确实很重要。

不幸的是,我写这篇内部文章已经有一段时间了,还没有完全引用所有来源。因此,如果我使用了您的一些代码,我提前表示歉意。

ASP.Net ViewState 管理

我测试了不使用 ViewState 管理、ASP.Net 2.0 的 PageStatePersister 和服务器缓存方法。

我的总体结果表明,服务器缓存方法优于其他方法。在某些情况下,PageStatePersister 的有效载荷与服务器缓存方法大致相等,但在包含更多服务器控件的页面上,PageStatePersister 远远落后于服务器缓存方法(参见下面的 Login.aspx)。

服务器缓存提供四个 ViewState 存储:会话、应用程序、AppGlobals、缓存。出于测试目的,我只使用了服务器缓存,因为下面的数据显示它是更优越的方法。

根据本文以及位于 http://www.eggheadcafe.com/articles/20040613.asp 的基准测试,我的结论是应该使用服务器缓存方法。

不使用服务器端方案的 ViewState 测试在第一列;接下来是四种服务器端方案

VIEWSTATE WEB 压力比较

测试名称

VIEWSTATE

SESSION

APPLICATION

CACHE

GLOBALS

点击次数

3322

18483

18476

20170

16723

请求/秒

27.64

153.8

153.74

167.84

140.32

接收总字节数 (KB)

68016.63

22923.25

22977.13

25074.51

20798

百分比差异

N/A

456.44%

456.22%

507.24%

407.67%

关于服务器存储方法,我自己也使用了相同的设计模式——首先通过基类路由数据——非常巧妙。

我创建了一个包含 ViewState 处理程序的程序集,可以将其导入到所有使用这些类的未来项目中。再说一次——一次编写,随处使用。我还对一些代码进行了转换,以更好地与 2.0 兼容。

测试结果如下

Default01.aspx

无 Viewstate 管理:~ 329 字符 | 有效负载:1k

<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="/wEPDwULLTExMjY5MTM5MTYPZBYCAgMPZBYCAgsPZBYCAgEPFgIeC18h
SXRlbUNvdW50AgUWCmYPZBYCZg8VAQdBZHZhbnRhZAIBD2QWAmYPFQEQQW
1lcmljYW4gRXhwcmVzc2QCAg9kFgJmDxUBCUJBTktGSVJTVGQCAw9kFgJmDxUB
BUNoYXNlZAIED2QWAmYPFQEXQ29sdW1idXMgQmFuayBhbmQgVHJ1c3RkZHE/U
FRpXKP0LBuXCsdD3lver4Y3" />

<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="/wEPDwULLTExMjY5MTM5MTYPZBYCAgMPZBYCAgsPZBYCAgEPFgIeC18h
SXRlbUNvdW50AgUWCmYPZBYCZg8VAQdBZHZhbnRhZAIBD2QWAmYPFQEQQW
1lcmljYW4gRXhwcmVzc2QCAg9kFgJmDxUBCUJBTktGSVJTVGQCAw9kFgJmDxUB
BUNoYXNlZAIED2QWAmYPFQEXQ29sdW1idXMgQmFuayBhbmQgVHJ1c3RkZHE/U
FRpXKP0LBuXCsdD3lver4Y3" />

PageStatePersister:~ 129 字符 | 有效负载:< 1k

<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="/wEPaA8FDzhjODNlOWE3YzI3MGY1OGRg4WBM0VRZaUOeHh7vqbaRwGRdYA==" />

<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="/wEPaA8FDzhjODNlOWMyNTU5MGZlZWSRqIAAKVQl2MXv4b2MnOhsDZhOJA==" />

服务器缓存 Viewstate 存储:~ 140 字符 | 有效负载:< 1k

<input type="hidden" name="__VIEWSTATE1" id="__VIEWSTATE1" value="4" />
<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="" />

<input type="hidden" name="__VIEWSTATE1" id="__VIEWSTATE1" value="9" />
<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="" />

无 Viewstate 管理:~ 349 字符 | 有效负载:~ 1k

<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="/wEPDwUJMzE0MTExNjQyD2QWAgIDD2QWAgIED2QWAgIBDxYCHgtfIUl0ZW
1Db3VudAIFFgpmD2QWAmYPFQEHQWR2YW50YWQCAQ9kFgJmDxUBEEFtZXJpY
2FuIEV4cHJlc3NkAgIPZBYCZg8VAQlCQU5LRklSU1RkAgMPZBYCZg8VAQVDaGFzZWQ
CBA9kFgJmDxUBF0NvbHVtYnVzIEJhbmsgYW5kIFRydXN0ZBgBBQlHcmlkVmlldzEPZ2R
mesVnAmycBPQuwY/+R2iSTw8AgA==" />

<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="/wEPDwUJMzE0MTExNjQyD2QWAgIDD2QWAgIED2QWAgIBDxYCHgtfIUl0ZW1
Db3VudAIFFgpmD2QWAmYPFQEHQWR2YW50YWQCAQ9kFgJmDxUBEEFtZXJpY2F
uIEV4cHJlc3NkAgIPZBYCZg8VAQlCQU5LRklSU1RkAgMPZBYCZg8VAQVDaGFzZWQCB
A9kFgJmDxUBF0NvbHVtYnVzIEJhbmsgYW5kIFRydXN0ZBgBBQlHcmlkVmlldzEPZ2Rme
sVnAmycBPQuwY/+R2iSTw8AgA==" />

PageStatePersister:~ 149 字符 | 有效负载:< 1k

<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="/wEPaA8FDzhjODNlOWQ1YTljYjg0NBgBBQlHcmlkVmlldzEPZ2S3+UlLsRyU8KTbI
sZjQZTqo3Eh2Q==" />

<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="/wEPaA8FDzhjODNlOWQ2MzI3MDRhNhgBBQlHcmlkVmlldzEPZ2R0CWKRyWY
H15G9LmpwwFnocxQkxQ==" />

服务器缓存 Viewstate 存储:~ 141 字符 | 有效负载:< 1k

<input type="hidden" name="__VIEWSTATE1" id="__VIEWSTATE1" value="11" />
<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="" />

Login.aspx

无 Viewstate 管理:~ 1345 字符 | 有效负载:~ 2k

<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="/wEPDwUKLTM3MDg0NzE3NWQYAwUeX19Db250cm9sc1JlcXVpcmVQb3N0QmF
ja0tleV9fFg0FEUxvZ2luMSRSZW1lbWJlck1lBRdMb2dpbjEkTG9naW5JbWFnZUJ1dHRvbg
U8Q3JlYXRlVXNlcldpemFyZDEkX19DdXN0b21OYXYwJFN0ZXBQcmV2aW91c0J1dHRvbk
ltYWdlQnV0dG9uBThDcmVhdGVVc2VyV2l6YXJkMSRfX0N1c3RvbU5hdjAkU3RlcE5leHRCd
XR0b25JbWFnZUJ1dHRvbgU2Q3JlYXRlVXNlcldpemFyZDEkX19DdXN0b21OYXYwJENhbm
NlbEJ1dHRvbkltYWdlQnV0dG9uBUlDcmVhdGVVc2VyV2l6YXJkMSRTdGFydE5hdmlnYXRp
b25UZW1wbGF0ZUNvbnRhaW5lcklEJFN0YXJ0TmV4dEltYWdlQnV0dG9uBUZDcmVhdGVV
c2VyV2l6YXJkMSRTdGFydE5hdmlnYXRpb25UZW1wbGF0ZUNvbnRhaW5lcklEJENhbmNlb
EltYWdlQnV0dG9uBU9DcmVhdGVVc2VyV2l6YXJkMSRGaW5pc2hOYXZpZ2F0aW9uVGVtc
GxhdGVDb250YWluZXJJRCRGaW5pc2hQcmV2aW91c0ltYWdlQnV0dG9uBUdDcmVhdGVV
c2VyV2l6YXJkMSRGaW5pc2hOYXZpZ2F0aW9uVGVtcGxhdGVDb250YWluZXJJRCRGaW5p
c2hJbWFnZUJ1dHRvbgVHQ3JlYXRlVXNlcldpemFyZDEkRmluaXNoTmF2aWdhdGlvblRlbXBs
YXRlQ29udGFpbmVySUQkQ2FuY2VsSW1hZ2VCdXR0b24FS0NyZWF0ZVVzZXJXaXphcmQx
JFN0ZXBOYXZpZ2F0aW9uVGVtcGxhdGVDb250YWluZXJJRCRTdGVwUHJldmlvdXNJbWFnZ
UJ1dHRvbgVHQ3JlYXRlVXNlcldpemFyZDEkU3RlcE5hdmlnYXRpb25UZW1wbGF0ZUNvbnRh
aW5lcklEJFN0ZXBOZXh0SW1hZ2VCdXR0b24FRUNyZWF0ZVVzZXJXaXphcmQxJFN0ZXBOY
XZpZ2F0aW9uVGVtcGxhdGVDb250YWluZXJJRCRDYW5jZWxJbWFnZUJ1dHRvbgURQ3JlY
XRlVXNlcldpemFyZDEPEGQUKwABZmZkBSFDcmVhdGVVc2VyV2l6YXJkMSRXaXphcmRN
dWx0aVZpZXcPD2RmZIG8LAAmxd9A5eBGBmrtERp+z8nr" />

<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="/wEPDwUKLTM3MDg0NzE3NWQYAwUeX19Db250cm9sc1JlcXVpcmVQb3N0QmF
ja0tleV9fFg0FEUxvZ2luMSRSZW1lbWJlck1lBRdMb2dpbjEkTG9naW5JbWFnZUJ1dHRvbg
U8Q3JlYXRlVXNlcldpemFyZDEkX19DdXN0b21OYXYwJFN0ZXBQcmV2aW91c0J1dHRvbkl
tYWdlQnV0dG9uBThDcmVhdGVVc2VyV2l6YXJkMSRfX0N1c3RvbU5hdjAkU3RlcE5leHRCd
XR0b25JbWFnZUJ1dHRvbgU2Q3JlYXRlVXNlcldpemFyZDEkX19DdXN0b21OYXYwJENhb
mNlbEJ1dHRvbkltYWdlQnV0dG9uBUlDcmVhdGVVc2VyV2l6YXJkMSRTdGFydE5hdmlnYX
Rpb25UZW1wbGF0ZUNvbnRhaW5lcklEJFN0YXJ0TmV4dEltYWdlQnV0dG9uBUZDcmVhd
GVVc2VyV2l6YXJkMSRTdGFydE5hdmlnYXRpb25UZW1wbGF0ZUNvbnRhaW5lcklEJENhb
mNlbEltYWdlQnV0dG9uBU9DcmVhdGVVc2VyV2l6YXJkMSRGaW5pc2hOYXZpZ2F0aW9u
VGVtcGxhdGVDb250YWluZXJJRCRGaW5pc2hQcmV2aW91c0ltYWdlQnV0dG9uBUdDc
mVhdGVVc2VyV2l6YXJkMSRGaW5pc2hOYXZpZ2F0aW9uVGVtcGxhdGVDb250YWluZXJ
JRCRGaW5pc2hJbWFnZUJ1dHRvbgVHQ3JlYXRlVXNlcldpemFyZDEkRmluaXNoTmF2aWd
hdGlvblRlbXBsYXRlQ29udGFpbmVySUQkQ2FuY2VsSW1hZ2VCdXR0b24FS0NyZWF0ZVV
zZXJXaXphcmQxJFN0ZXBOYXZpZ2F0aW9uVGVtcGxhdGVDb250YWluZXJJRCRTdGVwU
HJldmlvdXNJbWFnZUJ1dHRvbgVHQ3JlYXRlVXNlcldpemFyZDEkU3RlcE5hdmlnYXRpb25U
ZW1wbGF0ZUNvbnRhaW5lcklEJFN0ZXBOZXh0SW1hZ2VCdXR0b24FRUNyZWF0ZVVzZX
JXaXphcmQxJFN0ZXBOYXZpZ2F0aW9uVGVtcGxhdGVDb250YWluZXJJRCRDYW5jZWxJ
bWFnZUJ1dHRvbgURQ3JlYXRlVXNlcldpemFyZDEPEGQUKwABZmZkBSFDcmVhdGVVc
2VyV2l6YXJkMSRXaXphcmRNdWx0aVZpZXcPD2RmZIG8LAAmxd9A5eBGBmrtERp+z8nr" />

PageStatePersister:~ 1353 字符 | 有效负载:~ 2k

<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="/wEPaA8FDzhjODNlOWI2ODhhNzZiNBgDBR5fX0NvbnRyb2xzUmVxdWlyZVBvc3
RCYWNrS2V5X18WDQURTG9naW4xJFJlbWVtYmVyTWUFF0xvZ2luMSRMb2dpbkltYWdl
QnV0dG9uBTxDcmVhdGVVc2VyV2l6YXJkMSRfX0N1c3RvbU5hdjAkU3RlcFByZXZpb3VzQ
nV0dG9uSW1hZ2VCdXR0b24FOENyZWF0ZVVzZXJXaXphcmQxJF9fQ3VzdG9tTmF2MCR
TdGVwTmV4dEJ1dHRvbkltYWdlQnV0dG9uBTZDcmVhdGVVc2VyV2l6YXJkMSRfX0N1c3Rvb
U5hdjAkQ2FuY2VsQnV0dG9uSW1hZ2VCdXR0b24FSUNyZWF0ZVVzZXJXaXphcmQxJFN0Y
XJ0TmF2aWdhdGlvblRlbXBsYXRlQ29udGFpbmVySUQkU3RhcnROZXh0SW1hZ2VCdXR0
b24FRkNyZWF0ZVVzZXJXaXphcmQxJFN0YXJ0TmF2aWdhdGlvblRlbXBsYXRlQ29udGFpb
mVySUQkQ2FuY2VsSW1hZ2VCdXR0b24FT0NyZWF0ZVVzZXJXaXphcmQxJEZpbmlzaE5h
dmlnYXRpb25UZW1wbGF0ZUNvbnRhaW5lcklEJEZpbmlzaFByZXZpb3VzSW1hZ2VCdXR0
b24FR0NyZWF0ZVVzZXJXaXphcmQxJEZpbmlzaE5hdmlnYXRpb25UZW1wbGF0ZUNvbnR
haW5lcklEJEZpbmlzaEltYWdlQnV0dG9uBUdDcmVhdGVVc2VyV2l6YXJkMSRGaW5pc2hOY
XZpZ2F0aW9uVGVtcGxhdGVDb250YWluZXJJRCRDYW5jZWxJbWFnZUJ1dHRvbgVLQ3JlY
XRlVXNlcldpemFyZDEkU3RlcE5hdmlnYXRpb25UZW1wbGF0ZUNvbnRhaW5lcklEJFN0ZXBQ
cmV2aW91c0ltYWdlQnV0dG9uBUdDcmVhdGVVc2VyV2l6YXJkMSRTdGVwTmF2aWdhdGlvb
lRlbXBsYXRlQ29udGFpbmVySUQkU3RlcE5leHRJbWFnZUJ1dHRvbgVFQ3JlYXRlVXNlcldpem
FyZDEkU3RlcE5hdmlnYXRpb25UZW1wbGF0ZUNvbnRhaW5lcklEJENhbmNlbEltYWdlQnV0d
G9uBRFDcmVhdGVVc2VyV2l6YXJkMQ8QZBQrAAFmZmQFIUNyZWF0ZVVzZXJXaXphcmQ
xJFdpemFyZE11bHRpVmlldw8PZGZkplxAEGixaZpDZjFXu/FEiNL4p5U=" />

<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="/wEPaA8FDzhjODNlOWJiMTBiNTk5ZRgDBR5fX0NvbnRyb2xzUmVxdWlyZVBvc3RC
YWNrS2V5X18WDQURTG9naW4xJFJlbWVtYmVyTWUFF0xvZ2luMSRMb2dpbkltYWdlQnV
0dG9uBTxDcmVhdGVVc2VyV2l6YXJkMSRfX0N1c3RvbU5hdjAkU3RlcFByZXZpb3VzQnV0d
G9uSW1hZ2VCdXR0b24FOENyZWF0ZVVzZXJXaXphcmQxJF9fQ3VzdG9tTmF2MCRTdG
VwTmV4dEJ1dHRvbkltYWdlQnV0dG9uBTZDcmVhdGVVc2VyV2l6YXJkMSRfX0N1c3RvbU
5hdjAkQ2FuY2VsQnV0dG9uSW1hZ2VCdXR0b24FSUNyZWF0ZVVzZXJXaXphcmQxJFN0Y
XJ0TmF2aWdhdGlvblRlbXBsYXRlQ29udGFpbmVySUQkU3RhcnROZXh0SW1hZ2VCdXR0
b24FRkNyZWF0ZVVzZXJXaXphcmQxJFN0YXJ0TmF2aWdhdGlvblRlbXBsYXRlQ29udGFp
bmVySUQkQ2FuY2VsSW1hZ2VCdXR0b24FT0NyZWF0ZVVzZXJXaXphcmQxJEZpbmlzaE
5hdmlnYXRpb25UZW1wbGF0ZUNvbnRhaW5lcklEJEZpbmlzaFByZXZpb3VzSW1hZ2VCdX
R0b24FR0NyZWF0ZVVzZXJXaXphcmQxJEZpbmlzaE5hdmlnYXRpb25UZW1wbGF0ZUNvb
nRhaW5lcklEJEZpbmlzaEltYWdlQnV0dG9uBUdDcmVhdGVVc2VyV2l6YXJkMSRGaW5pc2
hOYXZpZ2F0aW9uVGVtcGxhdGVDb250YWluZXJJRCRDYW5jZWxJbWFnZUJ1dHRvbgV
LQ3JlYXRlVXNlcldpemFyZDEkU3RlcE5hdmlnYXRpb25UZW1wbGF0ZUNvbnRhaW5lcklEJF
N0ZXBQcmV2aW91c0ltYWdlQnV0dG9uBUdDcmVhdGVVc2VyV2l6YXJkMSRTdGVwTmF
2aWdhdGlvblRlbXBsYXRlQ29udGFpbmVySUQkU3RlcE5leHRJbWFnZUJ1dHRvbgVFQ3Jl
YXRlVXNlcldpemFyZDEkU3RlcE5hdmlnYXRpb25UZW1wbGF0ZUNvbnRhaW5lcklEJENhb
mNlbEltYWdlQnV0dG9uBRFDcmVhdGVVc2VyV2l6YXJkMQ8QZBQrAAFmZmQFIUNyZWF
0ZVVzZXJXaXphcmQxJFdpemFyZE11bHRpVmlldw8PZGZk1a3F/q3nBJJ0+8canPDJgQV
8YLE=" />

服务器缓存 Viewstate 存储:~ 141 字符 | 有效负载:< 1k

<input type="hidden" name="__VIEWSTATE1" id="__VIEWSTATE1" value="1" />
<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="" />

<input type="hidden" name="__VIEWSTATE1" id="__VIEWSTATE1" value="2" />
<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="" />

管理 ViewState

解决方案是创建一个基类来管理 Viewstate。

创建一个名为 StaticAppGlobals 的程序集,其中包含三个文件

  • AppGlobal.cs
  • BasePage.cs(这是您将在所有类中继承的基类)
  • viewStateSvrMgr.cs

设置 ViewState 存储位置

我们可以选择将 ViewState 存储在以下几个位置之一

  • Session
  • Application
  • Appglobals
  • 缓存

接收器的选择在 Web 应用程序的 Web.config 文件中完成

<appSettings>
    <add key="ServerSideViewState" value="true"/>
    <!--ViewStateStore: session|application|appglobals|cache-->
    <add key="ViewStateStore" value="cache"/>
</appSettings>

使用基类

由于每个类都需要继承 System.Web.UI.Page,我们将从我们的基类继承它,并在所有类中继承我们的基类:

而不是

public partial class Default : System.Web.UI.Page
{
    ... 
}

我们类的定义现在变为

using StaticAppGlobals;  // viewstate management uses BasePage
public partial class Default : BasePage
{
    ... 
}

现在,由于所有页面都必须继承 Page,基类继承了它

namespace StaticAppGlobals
{
    public class BasePage : System.Web.UI.Page
    {
        ...
    }
    
    ...
}
……现在,您可以使用 C# ViewState 管理了!

关注点

在一个访问量很大的网站上,如果没有适当的缓存管理而使用服务器缓存方法,可能会导致服务器崩溃,因此其他方法可能更可取。

我还没有机会实现 SQL 存储,但很乐意看到它被添加进来。

我已经将此添加到我创建的几个项目中。其中一个项目允许管理员从单选按钮列表中选择存储位置。因此,无需重新编译,更改立即可生效。

历史

暂无……

© . All rights reserved.