No Richmond Code Camp , examinei alguns dos meus dicas e truques para fazer o ASP.NET funcionar o mais rápido possível . Uma das maiores coisas que você precisa fazer é reduzir o tamanho do seu ViewState e também movê-lo para o final da página . Fui informado que o View State pode ser retirado inteiramente da página à medida que está sendo enviado ao cliente (mais ou menos) e armazenado ou persistido como um arquivo local. Encontrei artigo de ponta de Dino Esposito sobre trabalhando com o ViewState onde ele demonstra esse princípio.
Eu tentei isso com algum código para ver o que aconteceu e fiquei agradavelmente surpreso que isso foi muito rápido e não produziu nenhuma exceção relacionada ao ViewState para mim. Vamos dar uma olhada, primeiro no ViewState original de uma página:
ZBYEZg9kFgQCAw8QZGQWAQIdBZAIfDxQrAAJkZGQCAQ9kFgQCAQ8WAh4HVmlza
WJsZWgWAgIBD2QWAgIBD2QWAgIFsDw8WAh4ISW1hZ2VVcmwFKmh0dHA6Ly9sb2
NhbGhvc3QvbWFjL2ltYWdlcy9jb250YWdN0XzMyLmdpZmRkAgUPZBYEAgEPFgIfAGcW
BAICD2QWAgIBDxYCHgRUZXh0BQ9MdaW5kYSBEZW1lcml0dGVkAgQPZBYEAgMPF
gIfAGcWAgICD2QWAgIBDxYCHwIFCfUFsYW4gSHVudGQCBQ8PFgIfAGhkZAICD2QW
AmYPZBYCAgEPFgIfAGhkGAEFJGNf0bDAwJENvbnRlbnRQbGFjZUhvbGRlcjEkTXVsdG
lWaWV3MQ8PZAIBZBLDmk8f72Yt1WKBfAWhD8KS0hJhM”/>
Agora, esta é a tag de entrada ViewState usando a persistência PageState:
/wEPGAEFJGN0bDAwJENvbnRlbnRQbGFjZUhvbGRlcjfEkTXVsdGlWaWV3MQ8PZAIBZA8FCTExNjE4Nz
U2Mg9kFgJmD2QWAgIBD2QWAgIOD2QWAgIBD2QWBGfYPZBYEAgMPEGRkFgECAWQCHw8UKwAC
ZGRkAgEPZBYEAgEPFgIeB1Zpc2libGVoFgICAQ9kFgICAQf9kFgICBQ8PFgIeCEltYWdlVXJsBSpodHRw
Oi8vbG9jYWxob3N0L21hYy9pbWFnZXMvY29udGFjdF8zMi5naWZkZAIFD2QWBAIBDxYCHwBnFgQCAg
9kFgICAQ8WAh4EVGV4dAUPTGluZGEgRGVtZfXJpdHRlZAIED2QWBAIDDxYCHwBnFgICAg9kFgICAQ8
WAh8CBQlBbGFuIEh1bnRkAgUPDxYCHw2AgoraQWBAIDDxYCHwBnFgICAg9kFgICAQ8
WAh8CBQlBbGFuIEh1bnRkAgUPDxAgora o problema com o arquivo ZWCADHGHWCZAgAgUPDxYCHwZAgoraQWCAD2 é vinculado a este arquivo ZWCADHGHWgZAgAgAgAgAgAgBg3g_WgZAgora está vinculado a ZWCADxAgWgZ_WC e o problema com o arquivo ZWCAD2. Portanto, você terá que construir um mecanismo de limpeza no aplicativo da web para manter o diretório o mais limpo possível. Por motivos de segurança, você também não pode ter permissão para armazenar mídia criada em tempo real ou carregada por usuários da web. Decidi que uma boa maneira de contornar esse problema seria armazenar o ViewState no cache com uma dependência. É claro que isso causa considerações sobre o uso de memória, então você terá que decidir o que é mais importante na sua situação.
Eu gosto de usar o Enterprise Library para lidar com minhas necessidades de cache, então você precisará investigar isso no seu, ou espere eu terei a chance de fazer um blog sobre o uso o bloco de cache. Mas até então, acredite em mim, isso funciona. A metodologia depende de dois métodos especiais sendo criados. Criei esses métodos para abstrair a metodologia dos dois métodos da classe Page que precisam ser substituídos. Também criei um método utilitário para retornar o id de sessão como um nome para a variável Cache, novamente apenas para abstrair isso.
Protegido
Função
LoadPageStateFromCache ()
As
Object
Dim
m_viewState
As
String
Dim
m_formatter
As
LosFormatter
Dim
viewStateBag
As
Objeto
Dim
pc
As
CacheManager=CacheFactory.GetCacheManager ()
Dim
sRequestContent
As
String
=
DirectCast
(pc.GetData (GetCacheName),
String
)If
String
.IsNullOrEmpty (sRequestContent)=
False
Then
Dim
sr
As
Novo
StringReader (sRequestContent)
m_viewState=sr.ReadToEnd ()
sr.Close ()
m_formatter=
Novo
LosFormatter ()
viewStateBag=m_formatter.Deserialize (m_viewState)
Fim
If
Retorno
String
. Vazio
End
Função
Protected
Sub
SavePageStateToCache (
ByVal
viewStateBagAs
Objeto
)
Dim
m_formatter
As
LosFormatter=
Novo
LosFormatter ()
Dim
stw
As
StringWriter=
Novo
StringWriter
m_formatter.Serialize (stw, viewStateBag)
Dim
primitivesCache
As
CacheManager=CacheFactory.GetCacheManager ()
primitivesCache.Add (GetCacheName, stw.ToString ( ), CacheItemPriority.Normal,
Novo
ExCacheRefreshAction, _
Novo
AbsoluteTime (DateAdd (DateInterval.Minute, Session.Timeout + 30, Now ())))
Fim
Sub
Protegido
Sobrecargas
Substitui
Função
LoadPageStateFromPersistenceMedium ()
As
Object
Retorno
LoadPageStateFromCache ()
‘Re turn LoadPageStateFromFile ()
‘Return MyBase.LoadPageStateFromPersistenceMedium ()
End
Função
Protegido
Overloads
Overrides
Sub
SavePageStateToPersistenceMedium (
ByVal
viewStateBagAs
Objeto
)
SavePageStateToCache (viewStateBag)
‘SavePageStateToFile (viewStateBag)
‘MyBase.SavePageStateToPersistenceMedium(viewStateBag)
End
Sub
Privado
Função
GetCacheName ()
As
String
Retorno
Session.SessionID.ToString
End
Function
Um truque que eu faço, só para ser um pouco seguro é dizer à dependência do Cache para manter o valor na memória por 30 minutos após o tempo limite da sessão. Isso nos levará a criar um manipulador para permitir que o usuário saiba que sua sessão expirou. Eu sei que sou muito ruim em estar sempre com meu computador ligado e em cerca de 20 páginas o tempo todo. Isso significa que muitas dessas páginas sem estado eventualmente causarão uma postagem de volta no servidor quando eu voltar a ele. Meu aplicativo de banco on-line faz isso se eu deixá-lo em execução sem postback em, digamos, 10 minutos, portanto, é um cenário comum de lidar. Isso levará a outra entrada do blog. Espero tê-lo pronto no NJ Code Camp neste fim de semana.