Web Service em.net 1 Criação de um Web Services em.net 1. Criar um novo projecto do tipo ASP.NET Web Service, de acordo com a figura seguinte. O.Net cria um directório virtual com os ficheiros indicados É no ficheiro.asmx.cs que será implementado o código do serviço. 2. Visualizar o código do ficheiro Service1.asmx.cs O.net cria um namespace DatasService e uma classe Service1 que implementa a classe System.Web.Services.WebService
Web Service em.net 2 namespace DatasService public class Service1 : System.Web.Services.WebService public Service1() InitializeComponent(); 3. Alterar o nome do ficheiro Service1.asmx para DemoServices.asmx usando o rename no Solution Explorer e alterar o nome da classe para DemoService namespace DatasService public class DemoService : System.Web.Services.WebService public DemoService() InitializeComponent(); O ficheiro.asmx tem a directiva WebService e contém uma referência para a classe que implementa o serviço <%@ WebService Language="c#" Codebehind="DemoService.asmx.cs" Class="DatasService.DemoService" %> 4. Criar na classe um método CalculaDias que recebe uma data e devolve um long com o número de dias que passaram até ao dia de hoje. [WebMethod] public long CalculaDias(DateTime dt) System.TimeSpan diff=datetime.now.subtract(dt); long dias=(long) diff.totaldays; return dias; Este método deve ter o atributo [WebMethod] para ser reconhecido como um método do serviço Web e poder ser chamado por outra aplicação. 5. Utilizar o atributo [WebService] na classe que implementa o serviço, para alterar o namespace da classe que por omissão é http://tempuri.org/ O código completo do serviço deve ser o seguinte: namespace DatasService [WebService(Namespace="dei.isep.demoservice")] public class DemoService : System.Web.Services.WebService public DemoService()
Web Service em.net 3 InitializeComponent(); [WebMethod] public long DiasdeVida(DateTime dt) System.TimeSpan diff=datetime.now.subtract(dt); long dias=(long) diff.totaldays; return dias; 6. Compilar o código como resultado da compilação o.net cria um assembly no directório bin do projecto DataService.dll 7. Testar o serviço implementado O.Net permite testar o serviço fazendo View in Browser no Solution Explorer ou usando no Internet Explorer o url: http://localhost/datasservice/demoservice.asmx A página seguinte é apresentada: Esta página é criada pela framework.net e permite testar o serviço implementado. Se seguir o link CalculaDias será apresentada a página seguinte:
Web Service em.net 4 Se introduzir na caixa de texto uma data válida (ano/mês/dia) o serviço retornará um longo resultado da chamada do método.
Web Service em.net 5 Criação de uma aplicação cliente do serviço 1. Criar um novo projecto do tipo ASP.NET Web Application, de acordo com a figura seguinte, com o nome ClienteDatas. 2. Criar uma página aspx muito simples, tendo como objectivo invocar o serviço criado anteriormente Crie os controlos de acordo com a figura seguinte:
Web Service em.net 6 3. Ligação ao Web Service Para invocar o serviço é necessário acrescentar uma Web Reference ao projecto, utilizando no item References do Solution Explorer a opção Add Web references Usando a opção Web Services on the local machine seleccione o Web Service anteriormente implementado e carregue no botão Add Reference. O.Net acrescenta ao projecto um directório Web References que contém um ficheiro DemoService.wsdl que descreve o serviço.
Web Service em.net 7 Implemente o seguinte código no evento click do botão CalculaDias private void Button1_Click(object sender, System.EventArgs e) localhost.demoservice ws=new ClienteDatas.localhost.DemoService(); DateTime dt=new DateTime(2004,1,1); long dias=ws.calculadias(dt); Label3.Text=dias.ToString(); Label3.Visible=true; Faça Build do projecto e em seguida View in Browser e deverá ter como resultado a seguinte página:
Web Service em.net 8 Framework.Net para Web Service A figura seguinte mostra o conjunto de eventos que acontecem quando é chamado um método de um serviço Web. Anatomy of an XML Web Service Lifetime -.NET Framework Developer's Guide 1. O cliente cria uma nova instância da classe proxy do serviço web. localhost.demoservice ws=new ClienteDatas.localhost.DemoService(); A classe proxy é criada pela platafoma.net através da descrição do serviço no ficheiro.wsdl. Esta classe está no ficheiro Reference.cs no directório Web References Extracto do Reference.cs [System.Diagnostics.DebuggerStepThroughAttribute()] [System.ComponentModel.DesignerCategoryAttribute("code")] [System.Web.Services.WebServiceBindingAttribute(Name="DemoServiceSoap ", Namespace="dei.isep.demoservice")] public class DemoService : System.Web.Services.Protocols.SoapHttpClientProtocol public DemoService() this.url = "http://localhost/datasservice/demoservice.asmx"; public long CalculaDias(System.DateTime dt) object[] results = this.invoke("calculadias", new object[] dt); return ((long)(results[0]));
Web Service em.net 9 2. O cliente invoca um método da classe proxy long dias=ws.calculadias(dt); 3. A plataforma no cliente formata (serialize) os argumentos do método numa mensagem SOAP e envia a mensagem através da rede usando o protocolo HTTP para o computador onde reside o serviço Web. Exemplo de uma mensagem SOAP: POST /DatasService/DemoService.asmx HTTP/1.1 Host: localhost Content-Type: text/xml; charset=utf-8 Content-Length: length SOAPAction: "dei.isep.demoservice/calculadias" <?xml version="1.0" encoding="utf-8"?> <soap:envelope xmlns:xsi="http://www.w3.org/2001/xmlschemainstance" xmlns:xsd="http://www.w3.org/2001/xmlschema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"> <soap:body> <CalculaDias xmlns="dei.isep.demoservice"> <dt>o valor do argumento</dt> </CalculaDias> </soap:body> </soap:envelope> O mapeamento é realizado usando o nome do método como elemento no XML - <CalculaDias> - e como sub-elementos os argumentos do método -<dt> Existem vários atributos para alterar o modo como este mapeamento é realizado 4. O serviço Web recebe a mensagem SOAP e deserialize o XML recebido. Cria uma instância da classe que implementa o serviço e invoca o método do serviço. 5. O serviço executa o código e serialize o resultado enviando uma mensagem de resposta para o cliente. HTTP/1.1 200 OK Content-Type: text/xml; charset=utf-8 Content-Length: length <?xml version="1.0" encoding="utf-8"?>
Web Service em.net 10 <soap:envelope xmlns:xsi="http://www.w3.org/2001/xmlschemainstance" xmlns:xsd="http://www.w3.org/2001/xmlschema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"> <soap:body> <CalculaDiasResponse xmlns="dei.isep.demoservice"> <CalculaDiasResult>o valor do resultado</calculadiasresult> </CalculaDiasResponse> </soap:body> </soap:envelope> O mapeamento da resposta é realizado acrescentando ao nome do método a palavra Response - <CalculaDiasResponse>