Se você tem o hábito de visualizar o código-fonte HTML da página atual que está navegando no IE, poderá ver frequentemente trechos de código semelhantes aos seguintes:
<input type="hidden" name="__VIEWSTATE" valor="dDwtMzU5NzUyMTQ1O3Q8O2w8aTwwPjs+O2w8dDw7bDxpPDA+Oz47bDx0PDtsPG
...
Se você for inteligente, com certeza vai perguntar: o que é isso? O que isso faz? Como isso se relaciona com este artigo? Caros leitores, por favor, ouçam-me com calma.
Na verdade, este é o desempenho característico da aplicação da tecnologia ViewState da MS no Asp.net. Para que a página ainda possa ler os dados de estado originais do controle do servidor após o PostBack, o Asp.net usa a tecnologia ViewState, que basicamente usa um campo de formulário do tipo Hidden com o nome padrão "__VIEWSTATE" para salvar e transferir dados . (Esses dados são valores de string codificados em Base64 serializados e são salvos antes da saída pelo método Page.SavePageStateToPersistenceMedium e carregados por Page.LoadPageStateFromPersistenceMedium) Embora possamos facilmente desabilitar a viagem de ida e volta desses dados através de três níveis Pass:
Conjunto de nível de máquina
.<páginas enableViewStateMac='false' /> em machine.config
No nível do aplicativo, defina <pages enableViewStateMac='false' /> no web.config do Web Applicin
No nível de página única, defina < %@Page enableViewStateMac='false' %> na página ou defina Page.EnableViewStateMac = false por meio do código;
No entanto, se pudermos resolver completamente a carga de transmissão de dados desabilitando o ViewState sem causar efeitos colaterais, então os arquitetos da MS não serão tão estúpidos a ponto de serem tão fofos (de que adianta deixar isso como algo dispensável?), porque muitas vezes Não podemos resolver esse problema de carga de transmissão simplesmente desativando-o, só podemos encontrar outro caminho para tornar o volume de transmissão na rede o menor possível, de modo que a compactação se tornou nossa primeira escolha. Contanto que sobrecarreguemos o método SavePageStateToPersistenceMedium() e o método LoadPageStateFromPersistenceMedium() da classe Page e comprimamos e descompactemos os dados no método sobrecarregado. As classes GZipInputStream e GZipOutputStream fornecidas pelo projeto de código aberto SharpZipLib entraram em nossa visão. Por conveniência, poderíamos também escrever uma classe CompressionHelper com o seguinte código:
1using System.IO;
2usando ICSharpCode.SharpZipLib.GZip;
3
4namespace Ycweb.Componentes
5{
6 /**//// <resumo>
7 /// Descrição resumida para CompressionHelper.
8 /// </summary>
9 classe pública CompressionHelper
10 {
11publicCompressionHelper()
12 {
13 //
14 // TODO: Adicione a lógica do construtor aqui
15 //
16}
17
18 /**//// <resumo>
19 /// Compactar dados
20 /// </summary>
21 /// <param name="data">Matriz de bytes a ser compactada</param>
22 /// <returns>Matriz de bytes compactados</returns>
23 byte estático público[] CompressByte(byte[] dados)
vinte e quatro {
25 MemoryStream ms = new MemoryStream();
26 Fluxo s=novo GZipOutputStream(ms);
27 s.Write(dados, 0, dados.Comprimento);
28 s.Fechar();
29 return ms.ToArray();
30}
31
32 /**//// <resumo>
33 /// Descompactar dados
34 /// </summary>
35 /// <param name="data">Matriz de bytes a ser descompactada</param>
36 /// <returns>Matriz de bytes descompactada</returns>
37 byte estático público[] DeCompressByte(byte[] dados)
38 {
39 byte[] writeData = novo byte[2048];
40 MemoryStream ms= novo MemoryStream(dados);
41 Fluxo sm = novo GZipInputStream(ms) como Fluxo;
42 MemoryStream outStream = new MemoryStream();
43 enquanto (verdadeiro)
44 {
45 tamanho interno = sm.Read(writeData,0, writeData.Length );
46 se (tamanho >0)
47 {
48 outStream.Write(writeData,0,tamanho);
49}
mais 50
51 {
52 pausa;
53}
54}
55 sm.Fechar();
56 bytes[] outArr = outStream.ToArray();
57 outStream.Close();
58 retorna Arr;
59}
60}
61} Em seguida, sobrecarregamos os métodos LoadPageStateFromPersistenceMedium() e SavePageStateToPersistenceMedium(Object viewState) na classe base de controle de página derivada da classe Page.
1Carregar e salvar dados do ViewState#region Carregar e salvar dados do ViewState
2 objeto de substituição protegido LoadPageStateFromPersistenceMedium()
3 {
4//Leia os dados do domínio oculto __SmartViewState registrado por você
5 string viewState = Request.Form["__SmartViewState"];
6 bytes[] bytes = Convert.FromBase64String(viewState);
7 //Chame o método estático CompressionHelper.DeCompressByte() fornecido acima para descompactar os dados
8 bytes = CompressionHelper.DeCompressByte(bytes);
9 Formatador LosFormatter = new LosFormatter();
10 retornam formatador.Deserialize(Convert.ToBase64String(bytes));
11
12}
13
14 substituição protegida void SavePageStateToPersistenceMedium (objeto viewState)
15 {
16 Formatador LosFormatter = new LosFormatter();
17 Escritor StringWriter = new StringWriter();
18 formatador.Serialize(escritor, viewState);
19 string viewStateString = escritor.ToString();
20 bytes[] bytes = Convert.FromBase64String(viewStateString);
21 //Chame o método estático CompressionHelper.CompressByte() fornecido acima para compactar os dados
22 bytes = CompressionHelper.CompressByte(bytes);
vinte e três
24 //Registre um novo campo oculto __SmartViewState, você também pode defini-lo você mesmo
25 this.RegisterHiddenField("__SmartViewState", Convert.ToBase64String(bytes));
26}
27#região final
Após o processamento acima, o código-fonte na página de saída da web é semelhante a:
<input type="hidden" name="__SmartViewState" valor="H4sIAPtPoNwA/81ce1PbWJb/ ……
<input type="hidden" name="__VIEWSTATE" valor="" />
O campo oculto original "__VIEWSTATE" tem um valor vazio e é substituído por um novo campo oculto "__SmartViewState" registrado por nós para armazenar a string compactada. Desta forma, o efeito de aceleração é óbvio. Por exemplo, o valor da string ViewState original da página inicial do DG3G.COM é de cerca de 28K e é de 7K após a compactação, enquanto o valor da string ViewState original da página inicial do Acafa.com é de cerca de 43K e é de 8K após a compactação. Este tipo de processamento é bastante satisfatório. Claro, se você achar que não é completo o suficiente, você também pode armazenar a string ViewState na Sessão. No entanto, se você fizer isso, a pressão na memória do servidor aumentará drasticamente (especialmente quando o número de visitas for grande). .É recomendável não usá-lo levianamente. Se o seu servidor web tiver 10G ou 8G de memória, você também pode tentar. O código modificado relevante é fornecido abaixo:
Altere o código no corpo do método LoadPageStateFromPersistenceMedium() acima:
string viewState = Request.Form["__SmartViewState"];
Modifique para:
string viewState = Session["__SmartViewState"].ToString();
Ao mesmo tempo, adicione o código no corpo SavePageStateToPersistenceMedium() acima:
this.RegisterHiddenField("__SmartViewState", Convert.ToBase64String(bytes));
Modifique para:
Session["__SmartViewState"] = Convert.ToBase64String(bytes);
Finalmente, os códigos e soluções acima são todos da prática de desenvolvimento do VS2003. Não faço nenhuma promessa sobre se o VS2005 é adequado. soluções, ficarei extremamente feliz.