sexta-feira, 13 de maio de 2011

Cache em IFrame

Como forçar a atualização de uma página aberta com um EmbPage? E para piorar, imagine uma carga onde essa página não é HTML mas um arquivo TXT, cujo conteúdo pode ser alterado.

Esse era o meu maior problema do dia, mas felizmente resolvido em 2 minutos, uma página com um IFrame que não poderia ser cacheada no browser, ou seja, deveria ser carregada a cada abertura.
Incluindo o EQUIV-Pragma

Gx não inclui automaticamente o Pragma no inicio do cabeçalho, não no gerador .Net, então é necessário incluí-lo através de um comando MetaEquiv.

<html>
<head>
<meta http-equiv="Pragma" content="no-cache">
<meta http-equiv="Expires" content="-1">

Para incluir colocar no evento Start a linha de código, a propriedade Expires determina o numero de segundos de validade da página. -1 indica que a página deve ser recarregada instantaneamente, mas é possível nesse local colocar um now() para pegar a data e hora corrente.

Event Start  
    Form.MetaEquiv.AddItem('Pragma', 'no-cache')
    Form.MetaEquiv.AddItem('Expires', '-1')
EndEvent

Esse comando deveria ser suficiente para recarregar a página, mas em algumas situações não funciona, como na minha, :(
Não funcionou
Se você se encontra no time do não funcionou na primeira vez, segue-se outra técnica, via DOM do JS.
Não existem opções no IFrame, e isso não é um problema do Genexus, para determinar o cachê da pagina, inclusive em nosso caso temos a carga não de uma página, mas de um arquivo txt.
A saída foi agregar um parâmetro randômico, junto ao arquivo, de forma a forçar um processamento antes da carga da pagina.  Para isso, uma interrogação seguida de um número randômico (nesse caso a data e hora corrente), resolve. 


 O TextBlock3 deve estar na interface, e marcado com formato HTML.


Agora sim,

No meu caso deu certo, estava utilizando um Internet Explorer modelo 9.0, flex, ..., se você dirige outro modeloprecisa avaliar a questão de compatibilidade do browser aos comandos JS programados.
Agora, o mais estranho de tudo isso, é que ao finalizar a programação JS resolvi comentar todas as alterações e testar novamente a aplicação para ver se o erro de atualização ainda persistia, e imagina o que aconteceu.  Tudo funcionava normalmente, ou seja, alguma coisa foi alterado internamente que corrigiu o problema.  Por via das duvidas mantive os ajustes.

Informações Complementares