Web Service em .Net 1 Criação de um Web Services em .Net 1. Criar um novo Web Site com template ASP.NET Web Service, de acordo com a figura seguinte. O Visual studio cria um directório com os ficheiros indicados 2. A implementação do serviço é realizada no ficheiro Service.cs [WebService(Namespace = "http://tempuri.org/")] [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] public class Service : System.Web.Services.WebService { public Service () {} Miguel Losa DEI-ISEP Web Service em .Net 2 3. Alterar o nome do ficheiro Service.asmx e Service.cs para DemoService.asmx e DemoService.asmx usando o rename no Solution Explorer e alterar o nome da classe para DemoService public class DemoService : System.Web.Services.WebService { public DemoService() { ... } 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="~/App_Code/DemoService.cs" Class="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 exposto 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/ [WebService(Namespace = "dei.isep.demoservice")] [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] public class DemoService : System.Web.Services.WebService { ... 6. Compilar o código 7. Testar o serviço implementado Miguel Losa DEI-ISEP Web Service em .Net 3 O .Net permite testar o serviço fazendo View in Browser no Solution Explorer ou usando no Internet Explorer o url, caso o projecto não seja File System, 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: Miguel Losa DEI-ISEP Web Service em .Net 4 Se introduzir na caixa de texto uma data válida (ano/mês/dia) o serviço retornará um long resultado da chamada do método. Miguel Losa DEI-ISEP Web Service em .Net 5 Criação de uma aplicação cliente do serviço 1. Acrescentar à solução um novo projecto do tipo ASP.NET Web Application, 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: Miguel Losa DEI-ISEP 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 Solution Explorer a opção Add Web Reference. Usando a opção Web Services in this solution, seleccione o Web Service anteriormente implementado e carregue no botão Add Reference. O .Net acrescenta ao projecto um directório App_WebReferences que contém um ficheiro DemoService.wsdl responsável pela descrição do serviço. Miguel Losa DEI-ISEP Web Service em .Net 7 Implemente o seguinte código no evento click do botão CalculaDias private void ChamarServiço_Click(object sender, System.EventArgs e) { localhost.DemoService proxy = new localhost.DemoService(); DateTime dt = new DateTime(2004, 1, 1); long dias = proxy.CalculaDias(dt); Label1.Text=dias.ToString(); Label1.Visible=true; } Faça Build do projecto e em seguida View in Browser e deverá ter como resultado a seguinte página: Miguel Losa DEI-ISEP 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 proxy=new localhost.DemoService(); .. A classe proxy é criada pela platafoma .Net através da descrição do serviço no ficheiro DemoService.wsdl. Esta classe está no ficheiro Reference.cs no directório Web References / .. /Reference.Map, onde é implementado o código responsável por chamar os métodos remotos do serviço – A classe Proxy Extracto do Reference.cs public partial class DemoService : System.Web.Services.Protocols.SoapHttpClientProtocol { private System.Threading.SendOrPostCallback CalculaDiasOperationCompleted; public DemoService() { this.Url = global::web_app_project.Properties.Settings. Default.web_app_project_localhost_DemoService; .. [System.Web.Services.Protocols.SoapDocumentMethodAttribute( dei.isep.demoservice/CalculaDias", RequestNamespace="dei.isep.demoservice", ResponseNamespace="dei.isep.demoservice", Miguel Losa DEI-ISEP Web Service em .Net 9 Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wr apped)] public long CalculaDias(System.DateTime dt) { object[] results = this.Invoke("CalculaDias", new object[] {dt}); return ((long)(results[0])); } 2. O cliente invoca um método da classe proxy long dias=proxy.CalculaDias(dt); 3. A plataforma no cliente formata (serialize) os argumentos do método numa mensagem XML/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/XMLSchema-instance" 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. Miguel Losa DEI-ISEP Web Service em .Net 10 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"?> <soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 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> Miguel Losa DEI-ISEP