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.