Introdução
Demorei mais do que eu pensava para escrever, estou tendo bastante correria no serviço graças as mudanças nas leis sobre PAF-ECF.
Mas isso é assunto para outro post talvez...
Voltando ao assunto, no post anterior eu demonstrei como se cria um serviço para ser utilizado no Silverlight. Agora vamos utiliza-lo!
Criando um Aplicativo Silverlight
Vamos criar um projeto silverlight no Visual Studio:

Figura 1 - Criando um Projeto Silverlight
Apos criado o projeto vamos abrir (se já não estiver aberto) o arquivo MainPage.xaml, vamos colocar um TextBlock e um botão para testar o serviço.
Você pode fazer isso alterando o código XAML ou pelo Expression Blend.
Código XAML
<StackPanel>
<TextBlock x:Name="lbResposta" Height="20" Width="100" Text="Resultado: "/>
<Button x:Name="btAcessar" Height="20" Width="100" Content="Acessar"/>
</StackPanel>
</Grid>
Referenciando o Serviço
Vamos referenciar o serviço, você pode clicar com o botão direito no seu projeto e ir no Add Service Reference.

Figura 2 - Acessando o Menu
Uma tela abrirá, coloque o endereço do seu serviço em 'Address' e click em 'Go'.
Apos ele encontrar o serviço você pode definir um nome para o namespace e confirmar clicando em 'Ok' como ilustrado na imagem abaixo.
Esse processo é igual para uma aplicação desktop.

Figura 3 - Referenciando o Serviço
Crie um método para o evento click do botão, você pode fazer com o Expression Blend ou por código xaml que o Visual Studio ajuda.

Figura 4 - Criando o Evento do Botão por XAML
Instanciando um Serviço e Vinculando Eventos
No MainPage.cs vamos declarar o serviço como um atributo(no escopo da classe), e no construtor vamos instanciar o serviço. No evento click do botão vamos chamar o método do serviço. A classe ficará assim:
C#
public partial class MainPage : UserControl
{
private ServiceReference1.MeuServicoClient ws;
public MainPage()
{
InitializeComponent();
ws = new ServiceReference1.MeuServicoClient();
}
private void btAcessar_Click(object sender, RoutedEventArgs e)
{
ws.DizOiAsync();
}
}
VB.Net
Public Partial Class MainPage
Inherits UserControl
Private ws As ServiceReference1.MeuServicoClient
Public Sub New()
InitializeComponent()
ws = New ServiceReference1.MeuServicoClient()
End Sub
Private Sub btAcessar_Click(ByVal sender As Object, ByVal e As RoutedEventArgs)
ws.DizOiAsync()
End Sub
End Class
Você percebeu que o método 'DizOiAsync' não retorna nada?
Os métodos do web service executam de modo assíncrono, o programa não espera ele executar para continuar rodando (isso é ótimo).
Na instancia do serviço('ws') há um evento 'DizOiCompleted', apenas precisamos inscrever o método nesse evento e receber o resultado.
Quando ele receber uma resposta do serviço ele irá disparar esse evento.
Para inscrever o evento precisamos de um método que satisfaça a assinatura(cabeçalho) do evento. Essa assinatura segue o padrão dos parâmetros 'object' e o 'EventArgs', no caso do EventArgs há um especializado do serviço que é o DizOiCompletedEventArgs, esse EventArgs tem uma propriedade Result que é a resposta do serviço.
Resumindo o método deve ter uma assinatura assim '(objet, DizOiCompletedEventArgs)', depois é só vincular como mostra o código abaixo:
C#
public MainPage()
{
//(...) código já implementado do construtor da classe
ws.DizOiCompleted += new EventHandler<ServiceReference1.DizOiCompletedEventArgs>(ws_DizOiCompleted);
}
private void ws_DizOiCompleted(object sender, ServiceReference1.DizOiCompletedEventArgs e)
{
lbResposta.Text = e.Result;
}
VB.Net
Public Sub New()
'(...) código já implementado do construtor da classe
AddHandler ws.DizOiCompleted, AddressOf ws_DizOiCompleted
End Sub
Private Sub ws_DizOiCompleted(ByVal sender As Object, ByVal e As ServiceReference1.DizOiCompletedEventArgs)
lbResposta.Text = e.Result
End Sub
Agora basta executar a aplicação e ver o resultado.
Detalhes
Qualquer exceção que ocorrer dentro do web service retornará uma mensagem 'The remote server returned an error: NotFound.', por esse motivo é bom tratar as exceções dentro do serviço, pois essa mensagem não quer dizer nada.
Outro detalhe é que para executar o silverlight consumindo os serviços fora do servidor(debuggar por exemplo) precisa de um arquivo de configuração o Cross Domain Policy na raiz do seu servidor, você pode ver detalhes nesse post no blog do Tim Heuer. É bem simples.
Até a próxima,
Tiago Esmeraldino

Nenhum comentário:
Postar um comentário