Si tiene la costumbre de ver el código fuente HTML de la página actual que está navegando en IE, es posible que a menudo vea fragmentos de código similares a los siguientes: Conjunto de nivel de máquina
En el nivel de aplicación, establezca
A nivel de página única, establezca < %@Page enableViewStateMac='false' %> en la página o establezca Page.EnableViewStateMac = false mediante código;
Sin embargo, si podemos resolver completamente la carga de la transmisión de datos deshabilitando ViewState sin causar efectos secundarios, entonces los arquitectos de MS no serán tan estúpidos como para ser tan lindos (¿de qué sirve dejarlo como algo prescindible?), Porque a menudo No podemos resolver este problema de carga de transmisión simplemente deshabilitándolo, solo podemos encontrar otra forma de hacer que el volumen de transmisión en la red sea lo más pequeño posible, por lo que la compresión se ha convertido en nuestra primera opción. Siempre que sobrecarguemos el método SavePageStateToPersistenceMedium () y el método LoadPageStateFromPersistenceMedium () de la clase Page, y comprimamos y descomprimamos los datos en el método sobrecargado. Las clases GZipInputStream y GZipOutputStream proporcionadas por el proyecto de código abierto SharpZipLib han llegado a nuestra vista. Por conveniencia, también podríamos escribir una clase CompressionHelper con el siguiente código:
1usando System.IO;
2usando ICSharpCode.SharpZipLib.GZip;
3
4espacio de nombres Ycweb.Componentes
5{
6 /**////
7 /// Descripción resumida de CompressionHelper.
8 ///
9 ayudante de compresión de clase pública
10 {
11 ayuda de compresión pública ()
12 {
13 //
14 // TODO: Agregar lógica de constructor aquí
15 //
16}
17
18 /**////
19 /// Comprimir datos
20 ///
21 /// Matriz de bytes a comprimir
22 ///
23 bytes estáticos públicos [] CompressByte (byte [] datos)
veinticuatro {
25 MemoryStream ms = nuevo MemoryStream();
26 Flujo s=nuevo GZipOutputStream(ms);
27 s.Write(datos, 0, datos.Longitud);
28 s.Cerrar();
29 devolver ms.ToArray();
30}
31
32 /**////
33 /// Descomprimir datos
34 ///
35 /// Matriz de bytes a descomprimir
36 ///
37 bytes estáticos públicos [] DeCompressByte (byte [] datos)
38 {
39 bytes[] writeData = nuevo byte[2048];
40 MemoryStream ms = nuevo MemoryStream (datos);
41 Stream sm = nuevo GZipInputStream(ms) como Stream;
42 MemoryStream outStream = nuevo MemoryStream();
43 mientras (verdadero)
44 {
45 int tamaño = sm.Read(writeData,0, writeData.Length);
46 si (talla >0)
47 {
48 outStream.Write(writeData,0,tamaño);
49 }
50 más
51 {
52 descanso;
53}
54 }
55 sm.Cerrar();
56 bytes[] outArr = outStream.ToArray();
57 outStream.Close();
58 regresanArr;
59 }
60 }
61} Luego sobrecargamos los métodos LoadPageStateFromPersistenceMedium() y SavePageStateToPersistenceMedium(Object viewState) en la clase base de control de página derivada de la clase Page.
1Cargar y guardar datos de ViewState#región Cargar y guardar datos de ViewState
2 objeto de anulación protegido LoadPageStateFromPersistenceMedium()
3 {
4//Leer datos del dominio oculto __SmartViewState registrado por usted mismo
5 cadenas viewState = Request.Form["__SmartViewState"];
6 bytes[] bytes = Convert.FromBase64String(viewState);
7 //Llame al método estático CompressionHelper.DeCompressByte() proporcionado anteriormente para descomprimir los datos
8 bytes = CompressionHelper.DeCompressByte(bytes);
9 formateador LosFormatter = nuevo LosFormatter();
10 formateador de retorno.Deserialize(Convert.ToBase64String(bytes));
11
12}
13
14 anulación protegida void SavePageStateToPersistenceMedium (Object viewState)
15 {
16 formateador LosFormatter = nuevo LosFormatter();
17 Escritor StringWriter = nuevo StringWriter();
18 formateador.Serialize(escritor, viewState);
19 cadena viewStateString = escritor.ToString();
20 bytes[] bytes = Convert.FromBase64String(viewStateString);
21 //Llame al método estático CompressionHelper.CompressByte() proporcionado anteriormente para comprimir los datos
22 bytes = CompressionHelper.CompressByte(bytes);
veintitrés
24 //Registra un nuevo campo oculto __SmartViewState, también puedes definirlo tú mismo
25 this.RegisterHiddenField("__SmartViewState", Convert.ToBase64String(bytes));
26}
27#región final
Después del procesamiento anterior, el código fuente en la página de salida web es como:
El campo oculto original "__VIEWSTATE" tiene un valor vacío y se reemplaza por un nuevo campo oculto "__SmartViewState" registrado por nosotros mismos para almacenar la cadena comprimida. De esta manera, el efecto de aceleración es obvio. Por ejemplo, el valor de la cadena ViewState original de la página de inicio de DG3G.COM es de aproximadamente 28 K y es de 7 K después de la compresión, mientras que el valor de la cadena ViewState original de la página de inicio de Acafa.com es de aproximadamente 43 K y es de 8 K después de la compresión. Este tipo de procesamiento es bastante satisfactorio. Por supuesto, si cree que no es lo suficientemente completo, también puede almacenar la cadena ViewState en la sesión. Sin embargo, si hace esto, la presión sobre la memoria del servidor aumentará considerablemente (especialmente cuando el número de visitas es grande). Se recomienda no usarlo a la ligera. Si su servidor web tiene memoria de 10G u 8G, también puede intentarlo. El código modificado relevante se proporciona a continuación:
Cambie el código en el cuerpo del método LoadPageStateFromPersistenceMedium() anterior:
cadena viewState = Request.Form["__SmartViewState"];
Modificar a:
cadena viewState = Sesión["__SmartViewState"].ToString();
Al mismo tiempo, agregue el código en el cuerpo SavePageStateToPersistenceMedium() anterior:
this.RegisterHiddenField("__SmartViewState", Convert.ToBase64String(bytes));
Modificar a:
Session["__SmartViewState"] = Convert.ToBase64String(bytes);
Finalmente, los códigos y soluciones anteriores son todos de la práctica de desarrollo de VS2003. Sin embargo, si puede obtener algo de lo anterior, no hago ninguna promesa. Soluciones, estaré extremadamente feliz.