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 () }
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
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:
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.
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:
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.
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:
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",
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.
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>