segunda-feira, 27 de outubro de 2008

Avançado - Recuperando Session, appSetting, etc no Silverlight

Aguns dias atrás estava procurando uma forma de recuperar dados que no silverlight não é possível, tais como, session, appSetting (WebConfig), cache, etc. pois trabalha "fora do contexto" de uma aplicação ASP.NET.

Hoje existem várias maneiras de fazer com que sua aplicação silverlight converse com sua aplicação Web, como initParams, entre outros. Mas essas formas não resolvem nosso problema de acessar o conteúdo descrito acima. Uma maneria muito simples que encontrei depois de muita pesquisa foi utilizar recursos do web service.

Primeiro de tudo, quando estamos trabalhando com silverlight, a maneira mais utilizada de trazer dados de um banco para a aplicação é utilizando Web Services (em muitos casos WCF, que é a tecnologia que adotaremos), mas Web Services não servem só para isso, podemos recuperar dados do Web Config, Sessions, etc. Aqui vai um exemplo.

No arquivo de código do web service (WCF) criei a seguinte operação:

[OperationContract]
public string GetAppSetting(string nome)
{
    string result = ConfigurationManager.AppSettings[nome];
    if (result != null)
       return result;
    return string.Empty;
}


Nesta operção wcf estou retornando o valor do appSetting que se encontra no webConfig/AppSetting, claro, se existir, senão retorna uma string vazia.

Na aplicação silverlight basta eu chamar esta operação no web referenceque aponta para o Web Service que à possui. Lembra-se que toda requisição no Silverlight é assíncrona, então esta também será. Sendo assim preciso definir um método/delegate que representa o momento em que a requisição é completada, que possui um object "sender" e um args "e", no nosso caso o GetAppSettingCompletedEventArgs que tem a propriedade result, que nada mais é o retorno da operação wcf definida no web service, neste exemplo, uma string. Abaixo, no load de uma página silverlight, chamo a operação.

void Page_Loaded(object sender, RoutedEventArgs e)
{
   
ServiceClient clientWS = new ServiceClient();
   
//Defino o método completed desta requisição, ou seja,
  
 //quando a operação recuperar o valor no
    //Web Service(WS)
    //este evento é disparado
    clientWS.GetAppSettingCompleted += new EventHandler   <GetAppSettingCompletedEventArgs>(clientWS_GetAppSettingCompleted);   
//Executa a operação
    clientWS.GetAppSettingAsync("AlgumaAppSetting");
}

(OBS: Para definir um EventHandler mais facilmente basta utilizar o "+=" depois 2x TAB para que o visual studio crie pra você, no exemplo acima, após digitar clientWS.GetAppSettingCompleted,
digite o + (mais) seguido do = (igual) e pressione 2x TAB)


O Evento de load da página acima envia a requisição pro WS e define EventHandler apontando para um método que representa o evento de quando a requisição wcf é completada, retornando o valor. Abaixo mostra este EventHandler.

void clientWS_GetAppSettingCompleted(object sender,
   
GetAppSettingCompletedEventArgs e)
{
    //Trata se possuir erro
    if (e.Error == null)
    {
       MessageBox.Show(e.Result);
    }
    else
       MessageBox.Show(e.Error.Message);       
}

Agora basta executar o projeto e ver como funciona, o mesmo pode ser aplicado para retornar Sessions, neste caso a operação wcf retornaria um object, entre outras propriedades do Configuration e HttpContext (No caso de session, HttpContext.Current).

Nenhum comentário: