locked
Como saber quando o browser foi fechado RRS feed

  • Pergunta

  • Bom dia.

    Tenho uma aplicação Silverlight. A tela inicial é a de login.

    Quando o usuario se loga eu crio uma variavel de sessão com o nome da empresa. Crio também uma variavel de aplicação que será o contador desta empresa para cada sessão aberta.

    Ex.

    Session["Empresa"] = ABC

    Application["ABC"] = 2

    Quando o usuario sair do browser eu preciso saber o valor de Session["Empresa"] e decrementar na variavel de Application? Como posso fazer isto?

    Obrigada 

    segunda-feira, 27 de fevereiro de 2012 12:41

Todas as Respostas

  • A única forma de detectar se a janela do browser fechou e tomar alguma ação nesse momento é via javascript.

    Minha sugestão é que você crie uma página ou use um httphandler que irá executar o código que você deseja que seja executado quando o usuário fechar a janela que tem a aplicação. Depois você deverá colocar um pouco de javascript da página que tem o silverlight para que, ao tentar fechar essa página a página que executa o seu código seja chamada. Segue abaixo o javascript que você deverá colocar na página, só não esqueça de trocar a url pela que executa o seu código.

    window.onunload = function () {
    
            function req(url) {
            //função generica que executa request usando javascript e preparada para funcionar em qualquer browser 
            //sem depender de bibliotecas externas como jQuery.
                var createXHR = function () {
                    try { return new XMLHttpRequest(); }
                    catch (ex) { }
                    try { return new XDomainRequest(); }
                    catch (ex) { }
                    try { return new ActiveXObject("Msxml2.XMLHTTP"); }
                    catch (ex) { }
                    try { return new ActiveXObject("Microsoft.XMLHTTP"); }
                    catch (ex) { }
                    return null;
                };
    
                var _xhr = createXHR();
    
                if (_xhr) {
                    _xhr.open("POST", url, false);
                    _xhr.send();
                }
            }
    
            try {
                req('/url-que-voce-deseja-executar.aspx');
            } catch (error) { //tratamento de erro vazio para que algum possivel erro no request não impeça o fechamento da janela }
        }
    };
    

    Eu já tentei várias outras abordagens, inclusive tentando chamar um web service de dentro do silverlight no evento de fechamento da aplicação, mas como o silverlight só trabalha com requests assincronos, assim que o request é feito, o controle volta para o browser que fecha a janela antes que o request seja concluído, e acaba cancelando-o. Não há nenhuma forma de segurar o controle da aplicação até o request ser concluído.

    O request do exemplo acima é feito via javascript de forma síncrona, fazendo com que a página só seja fechada depois que o request for concluído. Além disso, o request é feito via POST, para garantir que não terá cache e sempre seja executado. Eu utilizo essa abordagem atualmente em 2 sistemas que desenvolvi e está funcionando sem erros desde sua implantação. Funciona em todos os browsers que testei (IE6+, Chrome, Firefox3+, Safari, Opera). Essa abordagem também pode ser executada em casos que nada têm a ver com Silverlight, já que sua implementação requer apenas uma url a ser chamada e javascript para realizar a chamada no momento certo. Vale lembrar que esse javascript também será chamado se acontecer algum postback nessa página html ou se navegar para outra página, não apenas se a janela for fechada.


    Atenciosamente,

    Kelps Leite de Sousa | MVP Silverlight
    blog: http://kelps.net
    twitter : http://twitter.com/kelps

    Não se esqueça de "marcar como resposta" o ítem que lhe ajudou.

    quinta-feira, 5 de abril de 2012 12:16