Jika Anda memiliki kebiasaan melihat kode sumber HTML dari halaman yang sedang Anda jelajahi di IE, Anda mungkin sering melihat cuplikan kode seperti berikut:
<input type="tersembunyi" name="__VIEWSTATE" value="dDwtMzU5NzUyMTQ1O3Q8O2w8aTwwPjs+O2w8dDw7bDxpPDA+Oz47bDx0PDtsPG
...
Kalau kamu pintar pasti bertanya, apa ini? Apa fungsinya? Apa hubungannya dengan artikel ini? Pembaca yang budiman, tolong dengarkan saya perlahan.
Faktanya, ini adalah karakteristik kinerja penerapan teknologi ViewState MS di Asp.net. Agar halaman tetap dapat membaca data keadaan asli dari kontrol server setelah PostBack, Asp.net menggunakan teknologi ViewState, yang pada dasarnya menggunakan bidang formulir tipe Tersembunyi dengan nama default "__VIEWSTATE" untuk menyimpan dan mentransfer data
Page.SavePageStateToPersistenceMedium
dan dimuat oleh Page.LoadPageStateFromPersistenceMedium) Meskipun kita dapat dengan mudah menonaktifkan perjalanan bolak-balik data ini melalui tiga level
<halaman aktifkanViewStateMac='false' /> di mesin.config
Pada tingkat Aplikasi, atur <pages aktifkanViewStateMac='false' /> di web.config Aplikasi Web
Pada tingkat halaman tunggal, setel < %@Page EnableViewStateMac='false' %> di halaman atau setel Page.EnableViewStateMac = false melalui kode;
Namun, jika kita dapat sepenuhnya menyelesaikan beban transmisi data dengan menonaktifkan ViewState tanpa menimbulkan efek samping, maka arsitek MS tidak akan sebodoh itu untuk menjadi begitu lucu (apa gunanya membiarkannya sebagai hal yang tidak dapat diabaikan?), Karena kita sering kali tidak dapat menyelesaikan masalah beban transmisi ini hanya dengan menonaktifkannya, kami hanya dapat menemukan jalur lain untuk membuat volume transmisi dalam jaringan bolak-balik sekecil mungkin, sehingga kompresi menjadi pilihan pertama kami. Selama kita membebani metode SavePageStateToPersistenceMedium() dan metode LoadPageStateFromPersistenceMedium() dari kelas Halaman, serta mengompresi dan mendekompresi data dalam metode yang kelebihan beban. Kelas GZipInputStream dan GZipOutputStream yang disediakan oleh proyek open source SharpZipLib telah terlihat oleh kita. Untuk kenyamanan, sebaiknya kita menulis kelas CompressionHelper dengan kode berikut:
1using System.IO;
2menggunakan ICSharpCode.SharpZipLib.GZip;
3
4namespace Ycweb.Komponen
5{
6 /**//// <ringkasan>
7 /// Deskripsi ringkasan untuk CompressionHelper.
8 /// </ringkasan>
9 CompressionHelper kelas publik
10 {
11 Pembantu Kompresi Publik()
12 {
13 //
14 // TODO: Tambahkan logika konstruktor di sini
15 //
16}
17
18 /**//// <ringkasan>
19 /// Kompres data
20 /// </ringkasan>
21 /// <param name="data">Array byte yang akan dikompresi</param>
22 /// <returns>Array byte terkompresi</returns>
23 byte statis publik[] CompressByte(byte[] data)
dua puluh empat {
25 MemoryStream ms = MemoryStream baru();
26 Aliran s=GZipOutputStream(ms) baru;
27 s.Tulis(data, 0, data.Panjang);
28 detik.Tutup();
29 kembalikan ms.ToArray();
30}
31
32 /**//// <ringkasan>
33 /// Dekompresi data
34 /// </ringkasan>
35 /// <param name="data">Array byte yang akan didekompresi</param>
36 /// <returns>Array byte terdekompresi</returns>
37 byte statis publik[] DeCompressByte(byte[] data)
38 {
39 byte[] writeData = byte baru[2048];
40 MemoryStream ms= MemoryStream baru( data );
41 Aliran sm = GZipInputStream(ms) baru sebagai Aliran;
42 MemoryStream outStream = MemoryStream baru();
43 sementara (benar)
44 {
45 int ukuran = sm.Baca(writeData,0, writeData.Panjang );
46 jika (ukuran >0)
47 {
48 outStream.Write(writeData,0,ukuran);
49 }
50 lainnya
51 {
52 istirahat;
53}
54 }
55 sm.Tutup();
56 byte[] keluarArr = keluarStream.ToArray();
57 aliran keluar.Tutup();
58 kembali keluarArr;
59 }
60 }
61} Kemudian kita membebani metode LoadPageStateFromPersistenceMedium() dan SavePageStateToPersistenceMedium(Object viewState) di kelas dasar kontrol halaman yang berasal dari kelas Halaman Kodenya adalah sebagai berikut:
1Muat & Simpan Data ViewState#region Muat & Simpan Data ViewState
2 objek penggantian yang dilindungi LoadPageStateFromPersistenceMedium()
3 {
4//Baca data dari domain tersembunyi __SmartViewState yang Anda daftarkan sendiri
5 string viewState = Permintaan.Form["__SmartViewState"];
6 byte[] byte = Konversi.FromBase64String(viewState);
7 //Panggil metode statis CompressionHelper.DeCompressByte() yang disediakan di atas untuk mendekompresi data
8 byte = CompressionHelper.DeCompressByte(byte);
9 Pemformat LosFormatter = LosFormatter baru();
10 mengembalikan formatter.Deserialize(Convert.ToBase64String(bytes));
11
12}
13
14 penggantian yang dilindungi batal SavePageStateToPersistenceMedium(Object viewState)
15 {
16 Pemformat LosFormatter = LosFormatter baru();
17 Penulis StringWriter = StringWriter baru();
18 formatter.Serialize(penulis, viewState);
19 string viewStateString = penulis.ToString();
20 byte[] byte = Konversi.FromBase64String(viewStateString);
21 //Panggil metode statis CompressionHelper.CompressByte() yang disediakan di atas untuk mengompresi data
22 byte = CompressionHelper.CompressByte(byte);
dua puluh tiga
24 //Daftarkan bidang tersembunyi baru __SmartViewState, Anda juga dapat menentukannya sendiri
25 ini.RegisterHiddenField("__SmartViewState", Convert.ToBase64String(bytes));
26}
27#wilayah akhir
Setelah pengolahan di atas, kode sumber pada halaman keluaran web seperti:
<input type="tersembunyi" name="__SmartViewState" value="H4sIAPtPoNwA/81ce1PbWJb/ …
<input type="tersembunyi" nama="__VIEWSTATE" value="" />
Bidang tersembunyi asli "__VIEWSTATE" memiliki nilai kosong, dan digantikan oleh bidang tersembunyi baru "__SmartViewState" yang kami daftarkan untuk menyimpan string terkompresi. Dengan cara ini, efek percepatan terlihat jelas Misalnya, nilai string ViewState asli dari beranda DG3G.COM adalah sekitar 28K, dan menjadi 7K setelah kompresi, sedangkan nilai string ViewState asli dari beranda Acafa.com adalah sekitar 43K, dan menjadi 8K setelah kompresi. Pengolahan seperti ini cukup memuaskan. Tentu saja, jika Anda merasa kurang teliti, Anda juga dapat menyimpan string ViewState di Session. Namun, jika Anda melakukan ini, tekanan pada memori server akan meningkat tajam (terutama ketika jumlah kunjungan banyak) Disarankan untuk tidak menggunakannya dengan enteng. Jika server web Anda memiliki memori 10G atau 8G, Anda sebaiknya mencobanya. Kode modifikasi yang relevan diberikan di bawah ini:
Ubah kode pada isi metode LoadPageStateFromPersistenceMedium() di atas:
string viewState = Permintaan.Form["__SmartViewState"];
Ubah menjadi:
string viewState = Sesi["__SmartViewState"].ToString();
Pada saat yang sama, tambahkan kode di isi SavePageStateToPersistenceMedium() di atas:
this.RegisterHiddenField("__SmartViewState", Convert.ToBase64String(byte));
Ubah menjadi:
Session["__SmartViewState"] = Convert.ToBase64String(bytes);
Terakhir, kode dan solusi di atas semuanya dari praktik pengembangan VS2003. Saya tidak menjanjikan apakah VS2005 cocok solusinya, saya akan sangat senang.