Intrudução
Desde que o Silverlight 2 foi lançado eu comecei a estudar essa tecnologia. O Silverlight permite criar aplicações ricas na internet, ou seja, aplicações que se aproximam muito de uma desktop. Antes disso eu fazia aplicações com ASPX, mas só ASPX não era suficiente, tinha que integrar com Ajax/JScript para poder criar uma aplicação que funcionasse de maneira intuitiva para o usuário.
Foi ai que surgiu a ideia de usar o Silverlight 2, mas para uma aplicação funcionar tem que ter o famoso CRUD(Create, Retrieve, Update e Delete), em outras palavras o usuário tem que inserir, buscar, alterar e deletar dados e esses dados tem que ser persistentes.
Minha maior dificuldade no inicio foi justamente criar um serviço para fazer conexão com o banco e consumi-lo no Silverlight para criar meu CRUD.
Nesse tutorial vou ensinar a criar um web service em um projeto web comum e configurá-lo para que você use ele na sua aplicação do Silverlight 2 ou 3.
Esse artigo é para quem já tem um servidor e não sabe criar um web service para o Silverlight ou está tendo problemas para fazer funcionar.
Criando o WebSite
Vou criar um projeto do tipo website em uma solução separada do projeto do Silverlight, talvez você já tenha um projeto website pronto e você queira colocar o serviço nele, fica ao seu critério.
Para criar o projeto WebSite pelo menu:
File->New WebSite-> ASP.Net WebSite
Damos um nome para o projeto e escolhemos também a linguagem como mostra a figura 1, eu irei disponibilizar o código para C# e VB.Net.
Criando o Web Service no WebSite
Para criar o serviço pelo menu:
WebSite->Add New Item->Silverlight-Enabled WCF Service
Figura2 - Criando o Serviço no projeto Web Site
Esse tipo de serviço é muito parecido com o tradicional ASMX que talvez você já esteja habituado. Tudo que você faz com o ASMX é possível fazer com o WCF.
O serviço fica divido em dois arquivos, um com a extensão '.svc' que fica na raiz e a classe(.cs/.vb) que fica na pasta App_Code, como mostra na figura 3, logo abaixo.
Apos criarmos o serviço ele vem com um método de exemplo que é o DoWork. Todo método que você deseja utilizar na sua aplicação deve ter o atributo 'OperationContract', caso contrario ele não será visto por sua aplicação.
Bem vamos criar um novo método para testar nosso serviço.
CSharp
[OperationContract] public string DizOi() { return "Hello World"; }
VB.Net
<OperationContract()> _ Public Function DizOi() As String Return "Hello World" End Function
Ainda Falta Alguma Coisa...
Esse é o ponto chave, o pulo do gato, a risada da hiena, o rugido do leão... hehehe
Se você rodar no localhost irá funcionar perfeitamente mas talvez no seu servidor não rode!
Um jeito de você testar rapidamente se o seu serviço está ok é acessando via browser, exemplo: "www.meusite.com/meuapp/servico.svc".
Você pode se deperar ou já está se deparando com um erro semelhante a esse:
Server Error in '/MeuWebApp' Application.
This collection already contains an address with scheme http. There can be at most one address per scheme in this collection.
Parameter name: item
Implementando a Factory
Bem, falta implementar a factory que é bem simples (quando você já tem um código pronto hehe).
Adicione uma classe no seu projeto web como ilustra a figura abaixo:
Figura 4 - Adicionando uma Classe no Projeto
Nessa classe você colocará o código abaixo:
CSharp
using System.ServiceModel.Activation; using System.ServiceModel; using System; public class MeuServicoFactory : ServiceHostFactory { protected override ServiceHost CreateServiceHost(Type serviceType, Uri[] baseAddresses) { // Coloque o endereço do seu servico na string abaixo Uri webServiceAddress = new Uri("http://www.SEUSITE.com/MeuServico.svc"); ServiceHost webServiceHost = new ServiceHost(serviceType, webServiceAddress); return webServiceHost; } }
VB.Net
Imports Microsoft.VisualBasic Imports System.ServiceModel.Activation Imports System.ServiceModel Public Class MeuServicoFactory Inherits ServiceHostFactory Protected Overloads Overrides Function CreateServiceHost(ByVal serviceType As Type, ByVal baseAddresses As Uri()) As ServiceHost ' Coloque o endereço do seu serviço na string abaixo Dim webServiceAddress As New Uri("http://www.SEUSITE.com/MeuServico.svc") Dim webServiceHost As New ServiceHost(serviceType, webServiceAddress) Return webServiceHost End Function End Class
Coloque o endereço do seu serviço(.svc) no construtor da Uri como ilustrado no código acima.
Agora falta referenciar a factory no serviço, para isso abra o arquivo '.svc', você encontrará definições do seu serviço.
Depois da especificação do 'Service="MeuServico"' coloque uma especificação para o factory colocando o nome da sua classe factory 'Factory="MeuServicoFactory"'.
Seu '.svc' ficará assim:
<%@ ServiceHost Language="C#" Debug="true" Service="MeuServico"Factory="MeuServicoFactory" CodeBehind="~/App_Code/MeuServico.cs" %>
Testando o Serviço no Navegador
Com a factory criada e marcada no '.svc' vamos testar, copie o seu web site para o servidor e acesse ele no navegador. Se o seu web service estiver "saudavel" aparecerá no navegador dois exemplos de como usar ele na aplicação, como a imagem abaixo.
Figura 5 - Serviço Funcionando no Browser
No Próxima Parte
Na segunda parte desse tutorial iriei ensinar como consumir o serviço no Silverlight.
Espero ter ajudado já nessa primeira parte a fazer o serviço funcionar corretamente no servidor, dessa maneira ele está preparado para ser referenciado na aplicação Silverlight.
Até breve,
Tiago Esmeraldino