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:
<tipo de entrada="hidden" nombre="__VIEWSTATE" valor="dDwtMzU5NzUyMTQ1O3Q8O2w8aTwwPjs+O2w8dDw7bDxpPDA+Oz47bDx0PDtsPG
...
Si eres inteligente, definitivamente te preguntarás, ¿qué es esto? ¿Qué hace? ¿Cómo se relaciona con este artículo? Queridos lectores, escúchenme despacio.
De hecho, este es el rendimiento característico de la aplicación de la tecnología ViewState de MS en Asp.net. Para que la página aún pueda leer los datos de estado originales del control del servidor después de PostBack, Asp.net usa la tecnología ViewState, que esencialmente usa un campo de formulario de tipo oculto con el nombre predeterminado de "__VIEWSTATE" para guardar y transferir datos. (Estos datos son valores de cadena codificados en Base64 serializados y se guardan antes de la salida mediante el método Page.SavePageStateToPersistenceMedium y se cargan mediante Page.LoadPageStateFromPersistenceMedium) Aunque podemos desactivar fácilmente el viaje de ida y vuelta de estos datos a través de tres niveles Pasar:
Conjunto de nivel de máquina
.<páginas enableViewStateMac='false' /> en machine.config
En el nivel de aplicación, establezca <pages enableViewStateMac='false' /> en web.config de la aplicación web.
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 /**//// <resumen>
7 /// Descripción resumida de CompressionHelper.
8 /// </summary>
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 /**//// <resumen>
19 /// Comprimir datos
20 /// </summary>
21 /// <param name="data">Matriz de bytes a comprimir</param>
22 /// <returns>Matriz de bytes comprimida</returns>
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 /**//// <resumen>
33 /// Descomprimir datos
34 /// </summary>
35 /// <param name="data">Matriz de bytes a descomprimir</param>
36 /// <returns>Matriz de bytes descomprimida</returns>
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:
<tipo de entrada="hidden" nombre="__SmartViewState" valor="H4sIAPtPoNwA/81ce1PbWJb/ ……
<tipo de entrada="oculto" nombre="__VIEWSTATE" valor="" />
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.