Web Service .NET 4

<< Click to Display Table of Contents >>

Navigation:  ASP.NET > Dicas avançadas >

Web Service .NET 4

Previous pageReturn to chapter overviewNext page

Construindo um Web Service

 

Primeiro crie um novo projeto .NET 4:

 

File -> New Project -> Templades -> Visual C# -> WCF -> WCF Service Application

 

ws1

 

Por motivos didáticos, não alterei nenhum nome default neste exemplo.

 

Código (o que foi alterado está destacado):

 

Service1.cs

 

using System;

using System.Collections.Generic;

using System.Linq;

using System.Runtime.Serialization;

using System.ServiceModel;

using System.ServiceModel.Web;

using System.Text;

 

namespace WcfService1

{

    // NOTE: You can use the "Rename" command on the "Refactor" menu to change the class name "Service1" in code, svc and config file together.

    // NOTE: In order to launch WCF Test Client for testing this service, please select Service1.svc or Service1.svc.cs at the Solution Explorer and start debugging.

    public class Service1 : IService1

    {

        public string GetData(int codigo)

        {

            string[] lista = new string[5] { "Jessica""Angelina""Natalie""Charlize""Scarlet" };

            return (codigo < 1 || codigo > 5) ? "ERR: Código inválido" : lista[codigo - 1];

        }

 

        public string GetMensagem()

        {

            return "mensagem de testes";

        }

 

        public CompositeType GetDataUsingDataContract(CompositeType composite)

        {

            if (composite == null)

            {

                throw new ArgumentNullException("composite");

            }

            if (composite.BoolValue)

            {

                composite.StringValue += "Suffix";

            }

            return composite;

        }

    }

}

 

Nesta interface são declaradas as assinaturas para as funções:

 

IService1.cs

 

using System;

using System.Collections.Generic;

using System.Linq;

using System.Runtime.Serialization;

using System.ServiceModel;

using System.ServiceModel.Web;

using System.Text;

 

namespace WcfService1

{

    // NOTE: You can use the "Rename" command on the "Refactor" menu to change the interface name "IService1" in both code and config file together.

    [ServiceContract]

    public interface IService1

    {

 

        [OperationContract]

        string GetData(int value);

 

        [OperationContract]

        string GetMensagem();

 

        [OperationContract]

        CompositeType GetDataUsingDataContract(CompositeType composite);

 

        // TODO: Add your service operations here

    }

 

 

    // Use a data contract as illustrated in the sample below to add composite types to service operations.

    [DataContract]

    public class CompositeType

    {

        bool boolValue = true;

        string stringValue = "Hello ";

 

        [DataMember]

        public bool BoolValue

        {

            get { return boolValue; }

            set { boolValue = value; }

        }

 

        [DataMember]

        public string StringValue

        {

            get { return stringValue; }

            set { stringValue = value; }

        }

    }

}

 

Se rodar (rode o Service1.svc), uma programa "WCF Test Client" será executado para você testar o WebService:

 

ws2

 

Note que todas as funções declaradas são exibidas e permite testar passando valores e verificando os retornos.

 

Tipos Compostos

 

Você pode criar tipos complexos no WebService. Modifique os fontes e adicione isso:

 

Service1.cs

 

using System;

 

namespace WcfService1

{

    public class Service1 : IService1

    {

        public string GetData(int codigo)

        {

            string[] lista = new string[5] { "Jessica""Angelina""Natalie""Charlize""Scarlet" };

            return (codigo < 1 || codigo > 5) ? "ERR: Código inválido" : lista[codigo - 1];

        }

 

        public string GetMensagem()

        {

            return "mensagem de testes";

        }

 

        public Pessoa GetPessoa(int id)

        {

            Pessoa p = new Pessoa() { Id = id, Nome = "Ana Maria Braga", Nasc = new DateTime(1960, 12, 15), Salario = (decimal)7240.14 };

            return p;

        }

 

        public string GravarPessoa(Pessoa pessoa)

        {

            if (pessoa == null)

            {

                throw new ArgumentNullException("composite");

            }

            return pessoa.Nome + " foi gravado!";

        }

    }

}

 

Não esqueça da "assinatura" na interface:

 

IService1.cs

 

using System;

using System.Runtime.Serialization;

using System.ServiceModel;

 

namespace WcfService1

{

    [ServiceContract]

    public interface IService1

    {

        [OperationContract]

        string GetData(int value);

 

        [OperationContract]

        string GetMensagem();

 

        [OperationContract]

        Pessoa GetPessoa(int id);

 

        [OperationContract]

        string GravarPessoa(Pessoa pessoa);

    }

 

    // classe "contrato" que será usada para receber como parâmetro ou enviar como resposta

    [DataContract]

    public class Pessoa

    {

        [DataMember]

        public int Id { getset; }

 

        [DataMember]

        public string Nome { getset; } 

 

        [DataMember]

        public DateTime Nasc  { getset; } 

 

        [DataMember]

        public decimal Salario { getset; } 

    }

}

 

Testando:

 

ws3

 

Tudo 100% no lado do WebService.

Agora vamos fazer um programa para consumir esse WebService

 

Consumindo WebService via Web Forms

 

File -> New Project -> Visual C# -> Web -> ASP.NET Empty Web Application  (marque Add to Project)

 

ws4

 

Botão direito no projeto WebApplication1 e selecione Add Service Reference...

 

Clique em Discover -> Discover in Solution

Clique no Service1.svc e OK

 

ws5

 

Seu projeto fica assim:

 

ws6

 

Agora é fácil, adicione um aspx no seu projeto web e coloque alguns TextBox, Buttons e Labels (Copie o código para facilitar):

 

WebForm1.aspx

 

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm1.aspx.cs" Inherits="WebApplication1.WebForm1" %>

 

<!DOCTYPE html>

 

<html xmlns="http://www.w3.org/1999/xhtml">

<head runat="server">

    <title></title>

</head>

<body>

    <form id="form1" runat="server">

        <h3>GetData</h3>

        <asp:TextBox ID="TextBox1" runat="server"></asp:TextBox><br />

        <asp:Button ID="Button1" runat="server" Text="Button" OnClick="Button1_Click" /><br />

        <asp:Label ID="Label1" runat="server" Text="Label"></asp:Label><br />

 

        <h3>GetMensagem</h3>

        <asp:Button ID="Button2" runat="server" Text="Button" OnClick="Button2_Click" /><br />

        <asp:Label ID="Label2" runat="server" Text="Label"></asp:Label><br />

 

        <h3>GetPessoa</h3>

        <asp:TextBox ID="TextBox2" runat="server"></asp:TextBox><br />

        <asp:Button ID="Button3" runat="server" Text="Button" OnClick="Button3_Click" /><br />

        <asp:Label ID="Label3" runat="server" Text="Label"></asp:Label><br />

 

        <h3>SetPessoa</h3>

        <asp:Button ID="Button4" runat="server" Text="Button" OnClick="Button4_Click" /><br />

        <asp:Label ID="Label4" runat="server" Text="Label"></asp:Label><br />

    </form>

</body>

</html>

 

WebForm1.cs

 

using System;

 

namespace WebApplication1

{

    public partial class WebForm1 : System.Web.UI.Page

    {

        private ServiceReference1.Service1Client servico;

 

        protected void Page_Load(object sender, EventArgs e)

        {

            servico = new ServiceReference1.Service1Client();

        }

 

        protected void Button1_Click(object sender, EventArgs e)

        {

            Label1.Text = servico.GetData(int.Parse(TextBox1.Text));

        }

 

        protected void Button2_Click(object sender, EventArgs e)

        {

            Label2.Text = servico.GetMensagem();

        }

 

        protected void Button3_Click(object sender, EventArgs e)

        {

            ServiceReference1.Pessoa pessoa = servico.GetPessoa(1);

            Label3.Text = pessoa.Id + ", " + pessoa.Nome + ", " + pessoa.Nasc.ToString("dd/MM/yyyy") + ", " + pessoa.Salario.ToString("0,00");

        }

 

        protected void Button4_Click(object sender, EventArgs e)

        {

            ServiceReference1.Pessoa pessoa = new ServiceReference1.Pessoa();

            pessoa.Id = 10;

            pessoa.Nome = "Joca";

            pessoa.Nasc = new DateTime();

            pessoa.Salario = (decimal)1234.56;

            Label4.Text = servico.GravarPessoa(pessoa);

        }

    }

}

 

Resultado

 

ws7

 

Publicando na web

 

Uma vez publicado na web, ao acessar o service de teste aparece assim no browser ao acessar diretamente:

 

ws8

 

Para publicar o site, você deve redirecionar o serviço para versão "web". Basta editar o Web.config

 

<?xml version="1.0"?>

 

<configuration>

    <system.web>

      <compilation debug="true" targetFramework="4.0" />

    </system.web>

 

    <system.serviceModel>

        <bindings>

            <basicHttpBinding>

                <binding name="BasicHttpBinding_IService1" />

            </basicHttpBinding>

        </bindings>

        <client>

            <endpoint address="http://localhost:52283/Service1.svc" binding="basicHttpBinding"

                bindingConfiguration="BasicHttpBinding_IService1" contract="ServiceReference1.IService1"

                name="BasicHttpBinding_IService1" />

        </client>

    </system.serviceModel>

</configuration>

 

Troquei para

 

<?xml version="1.0"?>

 

<configuration>

    <system.web>

      <compilation debug="true" targetFramework="4.0" />

    </system.web>

 

    <system.serviceModel>

        <bindings>

            <basicHttpBinding>

                <binding name="BasicHttpBinding_IService1" />

            </basicHttpBinding>

        </bindings>

        <client>

            <endpoint address="http://teste.market.com.br/Service1.svc" binding="basicHttpBinding"

                bindingConfiguration="BasicHttpBinding_IService1" contract="ServiceReference1.IService1"

                name="BasicHttpBinding_IService1" />

        </client>

    </system.serviceModel>

</configuration>

 

E testar:

 

ws9

 

Lindo né?