Desenvolvimento - Web Services

Criando um WebService para controle de Clientes utilizando C#

O objetivo deste artigo é desenvolver um sistema de cadastro de clientes acessível através de um WebService, o qual poderá ser utilizado por outros sites que consumirem o WebService, possibilitando a inclusão, alteração, exclusão, consulta e autenticação de clientes pessoa física e pessoa jurídica.

por Jones Avelino



O objetivo deste artigo é desenvolver um sistema de cadastro de clientes acessível através de um WebService, o qual poderá ser utilizado por outros sites que consumirem o WebService, possibilitando a inclusão, alteração, exclusão, consulta e autenticação de clientes pessoa física e pessoa jurídica.

Nosso webservice deverá permitir o cadastro de pessoas física e jurídica, conforme diagrama de classes abaixo:

Conforme o Diagrama de Classes do nosso Projeto, vamos criar a seguinte Tabela em nosso Banco de Dados de Clientes. Utilizaremos o Microsoft Access:

É importante lembrar que o fato de termos mapeado o nosso diagrama de classes em apenas uma tabela, é apenas uma decisão de projeto, e teríamos pelo menos mais 2 formas possíveis de fazer este mapeamento, criando uma tabela para cada classe ou criando duas tabelas (pessoa física e pessoa jurídica) e repetindo os atributos de pessoa em cada uma delas.

Agora é hora de criarmos os nossos arquivos de classes, responsáveis basicamente por acessar o nosso banco de dados de clientes e efetuar as operações propostas pelo nosso projeto (inclusão, alteração, exclusão, consulta e autenticação de clientes). Para tanto, abra o seu Visual Studio, crie um novo Projeto e adicione 3 arquivos de classes: clsPessoa, clsPessoaFis e clsPessoaJur:

A nossa classe clsPessoa, será abstrata, ou seja, ela não poderá ser instanciada diretamente. Vamos escrever o código para criação de nossos atributos e métodos conforme o nosso diagrama de classes:

public abstract class clsPessoa
{
   //Definindo propriedades
   private long _cod;
   private string _nome;
   private string _email;
   private string _telefone;
   private string _login;
   private string _senha;
   
   public long cod
   {
      get{return _cod;}
      set{_cod = value;}
   }

   public string nome
   {
      get{return _nome;}
      set{_nome = value;}
   }

   public string email
   {
      get{return _email;}
      set{_email = value;}
   }

   public string telefone
   {
      get{return _telefone;}
      set{_telefone = value;}
   }

   public string login
   {
      get{return _login;}
      set{_login = value;}
   }

   public string senha
   {
      get{return _senha;}
      set{_senha = value;}
   }
}

Note que até agora, criamos a nossa classe abstrata e os nossos atributos (propriedades). Uma classe é abstrata se ela possui ao menos um método abstrato e tais métodos devem ser implementados pelas as subclasses que a herdarem. Vamos adicionar os nossos métodos em nossa classe abstrata:

   public clsPessoa()
   {
   } 

   public abstract void incluir();

   public abstract void alterar(); 

   public abstract DataSet obter();

   public virtual void excluir()
   {
      string strConn = 
System.Configuration.ConfigurationSettings.AppSettings.Get("connectionstring").ToString(); 

      StringBuilder strSql = new StringBuilder("");
      strSql.Append("DELETE FROM clientes ");
      strSql.Append("WHERE cod = @cod;");

      OleDbConnection conn = new OleDbConnection(strConn);
      OleDbParameter param = new OleDbParameter("@cod", this.cod);
      OleDbCommand cmd = new OleDbCommand();
      cmd.Parameters.Add(param);

      try
      {
         conn.Open(); 
         cmd.Connection = conn; 
         cmd.CommandType = CommandType.Text; 
         cmd.CommandText = strSql.ToString(); 
         cmd.ExecuteNonQuery(); 
      } 
      catch (OleDbException ex) 
      { 
         throw new Exception("ERRO BANCO DE DADOS: " + ex.Message.ToString()); 
      } 
         catch(Exception ex) 
      { 
         throw new Exception("ERRO RUNTIME: " + ex.Message.ToString()); 
      } 
      finally 
      { 
         cmd.Dispose(); 
         conn.Close(); 
         conn.Dispose(); 
      } 

   } 

   public virtual long autenticar() 
   { 
      string strConn = 
System.Configuration.ConfigurationSettings.AppSettings.Get("connectionstring").ToString(); 
      
      StringBuilder strSql = new StringBuilder(""); 
      strSql.Append("SELECT cod "); 
      strSql.Append("FROM clientes WHERE login = @login AND senha = @senha;"); 

      OleDbConnection conn = new OleDbConnection(strConn); 
      OleDbParameter[] param = new OleDbParameter[2]; 
      param[0] = new OleDbParameter("@login", this.login); 
      param[1] = new OleDbParameter("@senha", this.senha); 
      OleDbCommand cmd = new OleDbCommand(); 
      cmd.Parameters.Add(param[0]); 
      cmd.Parameters.Add(param[1]); 
      long ret = 0; 
      try 
      { 
         conn.Open(); 
         cmd.Connection = conn; 
         cmd.CommandType = CommandType.Text; 
         cmd.CommandText = strSql.ToString(); 
         ret = Convert.ToInt64(cmd.ExecuteScalar()); 
      } 
      catch (OleDbException ex) 
      { 
         throw new Exception("ERRO BANCO DE DADOS: " + ex.Message.ToString()); 
      } 
      catch(Exception ex) 
      { 
         throw new Exception("ERRO RUNTIME: " + ex.Message.ToString()); 
      } 
      finally 
      { 
         cmd.Dispose(); 
         conn.Close(); 
         conn.Dispose(); 
      } 
      return ret; 
   }  
Veja que utilizamos o modificador abstract para criar os nosso métodos abstratos, os quais serão implementados somente nas classes que herdarem esta classe (no nosso projeto, as classes clsPessoaFis e clsPessoaJur). Temos dois métodos (excluir e autenticar) que fazem a mesma coisa tanto para pessoa física quanto para pessoa jurídica, portanto, é necessário implementá-los apenas na superclasse e herdá-los em nossas subclasses. Para isso, utilizamos o modificador virtual. Agora, temos que implementar as nossas duas subclasses (clsPessoaFis e clsPessoaJur) herdando de nossa classe abstrata clsPessoa. Primeiro, vamos implementar os atributos da nossa classe clsPessoaFis conforme nosso diagrama de classes:
public class clsPessoaFis : clsPessoa 
{ 
   private string _cpf; 
   private DateTime _dtnasc; 
   private string _rg; 

   public string cpf 
   { 
      get{return _cpf;} 
      set{_cpf = value;} 
   }

   public DateTime dtnasc 
   { 
      get{return _dtnasc;} 
      set{_dtnasc = value;} 
   } 

   public string rg 
   { 
      get{return _rg;} 
      set{_rg = value;} 
   } 

   public clsPessoaFis() 
   { 
      this.cod = 0; 
      this.email = ""; 
      this.telefone = ""; 
      this.login = ""; 
      this.senha = ""; 
      this.cpf = ""; 
      this.rg = ""; 
   } 

   public clsPessoaFis(long cod, string nome, string email, string telefone, string login,
                       string senha, string cpf, DateTime dtnasc, string rg) 
   { 
      this.cod = cod; 
      this.nome = nome; 
      this.email = email; 
      this.telefone = telefone; 
      this.login = login; 
      this.senha = senha; 
      this.cpf = cpf; 
      this.dtnasc = dtnasc; 
      this.rg = rg; 
   }
}  

Criamos uma classe concreta (clsPessoaFis) herdando de nossa classe abstrata (clsPessoa) através do ":" na definição da classe. Além disso, utilizamos o conceito de sobreposição de métodos, criando 2 construtores para a nossa classe. Um deles sem nenhum parâmetro e o outro com todos os dados da pessoa física para inicialização do objeto.

Note que não precisamos definir os atributos cod, nome, email, telefone, login, e senha, pois eles são herdados de nossa superclasse.

Vamos agora implementar os nossos métodos para a nossa classe:

   public override void incluir() 
   { 
      string strConn =       
System.Configuration.ConfigurationSettings.AppSettings.Get("connectionstring").ToString(); 

      StringBuilder strSql = new StringBuilder(""); 
      strSql.Append("INSERT INTO clientes (nome, email, telefone, login, senha, cpf, dtnasc, rg)"); 
      strSql.Append("VALUES(@nome, @email, @telefone, @login, @senha, @cpf, @dtnasc, @rg)"); 

      OleDbConnection conn = new OleDbConnection(strConn); 
      OleDbParameter[] param = new OleDbParameter[8]; 
      param[0] = new OleDbParameter("@nome", this.nome); 
      param[1] = new OleDbParameter("@email", this.email); 
      param[2] = new OleDbParameter("@telefone", this.telefone); 
      param[3] = new OleDbParameter("@login", this.login); 
      param[4] = new OleDbParameter("@senha", this.senha); 
      param[5] = new OleDbParameter("@cpf", this.cpf); 
      param[6] = new OleDbParameter("@dtnasc", this.dtnasc); 
      param[7] = new OleDbParameter("@rg", this.rg); 
      param[6].OleDbType = OleDbType.Date; 
      OleDbCommand cmd = new OleDbCommand(); 
      for(byte i = 0;i < param.Length;i++) 
      { 
         cmd.Parameters.Add(param[i]); 
      } 

      try 
      { 
         conn.Open(); 
         cmd.Connection = conn; 
         cmd.CommandType = CommandType.Text; 
         cmd.CommandText = strSql.ToString(); 
         cmd.ExecuteNonQuery(); 
      } 
      catch (OleDbException ex) 
      { 
         throw new Exception("ERRO BANCO DE DADOS: " + ex.Message.ToString()); 
      } 
      catch(Exception ex) 
      { 
         throw new Exception("ERRO RUNTIME: " + ex.Message.ToString()); 
      } 
      finally 
      { 
         conn.Close(); 
         conn.Dispose(); 
         cmd.Dispose(); 
      } 
   } 

   public override void alterar() 
   { 
      string connString =       
System.Configuration.ConfigurationSettings.AppSettings.Get("connectionstring").ToString(); 

      StringBuilder strSql = new StringBuilder(""); 
      strSql.Append("UPDATE clientes SET "); 
      strSql.Append(" nome = @nome, "); 
      strSql.Append(" email = @email, "); 
      strSql.Append(" telefone = @telefone, "); 
      strSql.Append(" login = @login, "); 
      strSql.Append(" senha = @senha, "); 
      strSql.Append(" cpf = @cpf, "); 
      strSql.Append(" dtnasc = @dtnasc, "); 
      strSql.Append(" rg = @rg "); 
      strSql.Append("WHERE cod = @cod;"); 

      OleDbConnection conn = new OleDbConnection(connString); 
      OleDbParameter[] param = new OleDbParameter[9]; 
      param[0] = new OleDbParameter("@nome", this.nome); 
      param[1] = new OleDbParameter("@email", this.email); 
      param[2] = new OleDbParameter("@telefone", this.telefone); 
      param[3] = new OleDbParameter("@login", this.login); 
      param[4] = new OleDbParameter("@senha", this.senha); 
      param[5] = new OleDbParameter("@cpf", this.cpf); 
      param[6] = new OleDbParameter("@dtnasc", this.dtnasc); 
      param[7] = new OleDbParameter("@rg", this.rg); 
      param[8] = new OleDbParameter("@cod", this.cod); 
      param[6].OleDbType = OleDbType.Date; 
      OleDbCommand cmd = new OleDbCommand(); 
      for(byte i = 0;i < param.Length;i++) 
      { 
         cmd.Parameters.Add(param[i]); 
      } 

      try 
      { 
         conn.Open(); 
         cmd.Connection = conn; 
         cmd.CommandType = CommandType.Text; 
         cmd.CommandText = strSql.ToString(); 
         cmd.ExecuteNonQuery(); 
      } 
      catch (OleDbException ex) 
      { 
         throw new Exception("ERRO BANCO DE DADOS: " + ex.Message.ToString()); 
      } 
      catch(Exception ex) 
      { 
         throw new Exception("ERRO RUNTIME: " + ex.Message.ToString()); 
      } 
      finally 
      { 
         conn.Close(); 
         conn.Dispose(); 
         cmd.Dispose(); 
      } 
   } 

   public override DataSet obter() 
   { 
      string connString = 
System.Configuration.ConfigurationSettings.AppSettings.Get("connectionstring").ToString(); 

      StringBuilder strSql = new StringBuilder(""); 
      strSql.Append("SELECT cod, nome, email, telefone, login, senha, cpf, dtnasc, rg "); 
      strSql.Append("FROM clientes WHERE cod = @cod"); 

      OleDbConnection conn = new OleDbConnection(connString); 
      OleDbParameter param = new OleDbParameter("@cod", this.cod); 
      OleDbCommand cmd = new OleDbCommand(); 
      cmd.Parameters.Add(param); 
   
      try 
      { 
         conn.Open(); 
         cmd.Connection = conn; 
         cmd.CommandText = strSql.ToString(); 
         cmd.CommandType = CommandType.Text; 
         OleDbDataAdapter da = new OleDbDataAdapter(cmd); 
         DataSet ds = new DataSet(); 
         da.Fill(ds); 
         return ds; 
      } 
      catch (OleDbException ex) 
      { 
         throw new Exception("ERRO BANCO DE DADOS: " + ex.Message.ToString()); 
      } 
      catch(Exception ex) 
      { 
         throw new Exception("ERRO RUNTIME: " + ex.Message.ToString()); 
      } 
      finally 
      { 
         conn.Close(); 
         conn.Dispose(); 
         cmd.Dispose(); 
      } 
   } 
A implementação para a nossa classe clsPessoaJur é similar a implementação que fizemos acima. Portanto, colocarei o código completo da classe abaixo:
public class clsPessoaJur : clsPessoa 
{ 
   private string _cnpj; 
   private string _razao_social; 
   private string _insc_estatual; 
   
   public string cnpj 
   { 
      get{return _cnpj;} 
      set{_cnpj = value;} 
   } 

   public string razao_social 
   { 
      get{return _razao_social;} 
      set{_razao_social = value;} 
   } 

   public string insc_estatual 
   { 
      get{return _insc_estatual;} 
      set{_insc_estatual = value;} 
   } 

   public clsPessoaJur() 
   { 
      this.cod = 0; 
      this.email = ""; 
      this.telefone = ""; 
      this.login = ""; 
      this.senha = ""; 
      this.cnpj = ""; 
      this.razao_social = ""; 
      this.insc_estatual = ""; 
   }

   public clsPessoaJur(long cod, string nome, string email, string telefone, string login,
                       string senha, string cnpj, string razao_social, string insc_estatual) 
   { 
      this.cod = cod; 
      this.nome = nome; 
      this.email = email; 
      this.telefone = telefone; 
      this.login = login; 
      this.senha = senha; 
      this.cnpj = cnpj; 
      this.razao_social = razao_social; 
      this.insc_estatual = insc_estatual; 
   } 

   public override void incluir() 
   { 
      string strConn =       
System.Configuration.ConfigurationSettings.AppSettings.Get("connectionstring").ToString(); 
   
      StringBuilder strSql = new StringBuilder(""); 
      strSql.Append("INSERT INTO clientes (nome, email, telefone, login, senha, cnpj, razao_social, 
insc_estatual)"); 
      strSql.Append("VALUES(@nome, @email, @telefone, @login, @senha, @cnpj, @razao_social, 
@insc_estatual)"); 

      OleDbConnection conn = new OleDbConnection(strConn); 
      OleDbParameter[] param = new OleDbParameter[8]; 
      param[0] = new OleDbParameter("@nome", this.nome); 
      param[1] = new OleDbParameter("@email", this.email); 
      param[2] = new OleDbParameter("@telefone", this.telefone); 
      param[3] = new OleDbParameter("@login", this.login); 
      param[4] = new OleDbParameter("@senha", this.senha); 
      param[5] = new OleDbParameter("@cnpj", this.cnpj); 
      param[6] = new OleDbParameter("@razao_social", this.razao_social); 
      param[7] = new OleDbParameter("@insc_estatual", this.insc_estatual); 
      OleDbCommand cmd = new OleDbCommand(); 
      for(byte i = 0;i < param.Length;i++) 
      { 
         cmd.Parameters.Add(param[i]); 
      } 

      try 
      { 
         conn.Open(); 
         cmd.Connection = conn; 
         cmd.CommandType = CommandType.Text; 
         cmd.CommandText = strSql.ToString(); 
         cmd.ExecuteNonQuery(); 
      } 
      catch (OleDbException ex) 
      { 
         throw new Exception("ERRO BANCO DE DADOS: " + ex.Message.ToString()); 
      } 
      catch(Exception ex) 
      { 
         throw new Exception("ERRO RUNTIME: " + ex.Message.ToString()); 
      } 
      finally 
      { 
         conn.Close(); 
         conn.Dispose(); 
         cmd.Dispose(); 
      } 
   } 

   public override void alterar() 
   { 
      string connString = 
System.Configuration.ConfigurationSettings.AppSettings.Get("connectionstring").ToString(); 

      StringBuilder strSql = new StringBuilder(""); 
      strSql.Append("UPDATE clientes SET "); 
      strSql.Append(" nome = @nome, "); 
      strSql.Append(" email = @email, "); 
      strSql.Append(" telefone = @telefone, "); 
      strSql.Append(" login = @login, "); 
      strSql.Append(" senha = @senha, "); 
      strSql.Append(" cnpj = @cnpj, "); 
      strSql.Append(" razao_social = @razao_social, "); 
      strSql.Append(" insc_estatual = @insc_estatual "); 
      strSql.Append("WHERE cod = @cod;"); 

      OleDbConnection conn = new OleDbConnection(connString); 
      OleDbParameter[] param = new OleDbParameter[9]; 
      param[0] = new OleDbParameter("@nome", this.nome); 
      param[1] = new OleDbParameter("@email", this.email); 
      param[2] = new OleDbParameter("@telefone", this.telefone); 
      param[3] = new OleDbParameter("@login", this.login); 
      param[4] = new OleDbParameter("@senha", this.senha); 
      param[5] = new OleDbParameter("@cnpj", this.cnpj); 
      param[6] = new OleDbParameter("@razao_social", this.razao_social); 
      param[7] = new OleDbParameter("@insc_estatual", this.insc_estatual); 
      param[8] = new OleDbParameter("@cod", this.cod); 
      OleDbCommand cmd = new OleDbCommand(); 
      for(byte i = 0;i < param.Length;i++) 
      { 
         cmd.Parameters.Add(param[i]); 
      } 

      try 
      { 
         conn.Open(); 
         cmd.Connection = conn; 
         cmd.CommandType = CommandType.Text; 
         cmd.CommandText = strSql.ToString(); 
         cmd.ExecuteNonQuery(); 
      } 
      catch (OleDbException ex) 
      { 
         throw new Exception("ERRO BANCO DE DADOS: " + ex.Message.ToString()); 
      } 
      catch(Exception ex) 
      { 
         throw new Exception("ERRO RUNTIME: " + ex.Message.ToString()); 
      } 
      finally 
      { 
         conn.Close(); 
         conn.Dispose(); 
         cmd.Dispose(); 
      } 
   } 

   public override DataSet obter() 
   { 
      string connString = 
System.Configuration.ConfigurationSettings.AppSettings.Get("connectionstring").ToString(); 

      StringBuilder strSql = new StringBuilder(""); 
      strSql.Append("SELECT cod, nome, email, telefone, login, senha, cnpj, razao_social, insc_estatual "); 
      strSql.Append("FROM clientes WHERE cod = @cod"); 
      OleDbConnection conn = new OleDbConnection(connString); 
      OleDbParameter param = new OleDbParameter("@cod", this.cod); 
      OleDbCommand cmd = new OleDbCommand(); 
      cmd.Parameters.Add(param); 
      try 
      { 
         conn.Open(); 
         cmd.Connection = conn; 
         cmd.CommandText = strSql.ToString(); 
         cmd.CommandType = CommandType.Text; 
         OleDbDataAdapter da = new OleDbDataAdapter(cmd); 
         DataSet ds = new DataSet(); 
         da.Fill(ds); 
         return ds; 
      } 
      catch (OleDbException ex) 
      { 
         throw new Exception("ERRO BANCO DE DADOS: " + ex.Message.ToString()); 
      } 
      catch(Exception ex) 
      { 
         throw new Exception("ERRO RUNTIME: " + ex.Message.ToString()); 
      } 
      finally 
      { 
         conn.Close(); 
         conn.Dispose(); 
         cmd.Dispose(); 
      } 
   } 
} 
Agora que já implementamos as nossas classes de acesso ao banco de dados, vamos criar o webservice que vai utilizá-las para disponibilizar o nosso cadastro de clientes através da internet.

Adicione um novo item ao projeto (WebService):

Após criarmos o arquivo, iremos implementar 8 métodos de acesso público conforme descrito abaixo:

incluirPF: inclui uma pessoa física.
incluirPJ: inclui uma pessoa jurídica.
alterarPF: altera uma pessoa física cadastrada.
alterarPJ: altera uma pessoa jurídica cadastrada.
obterPF: obtém um DataSet contendo os dados de uma pessoa física.
obterPJ: obtém um DataSet contendo os dados de uma pessoa jurídica.
excluir: exclui uma pessoa (física ou jurídica) cadastrada.
autenticar: verifica se uma pessoa (física ou jurídica) está cadastrada a partir do seu login e senha cadastrados e retorna o seu código.

public class WsClientes : System.Web.Services.WebService 
{ 
   [WebMethod] 
   public void incluirPF(string nome, string email, string telefone, string login, string senha,
                         string cpf, DateTime dtnasc, string rg) 
   { 
      clsPessoaFis objPessoa = new clsPessoaFis(); 
      objPessoa.nome = nome; 
      objPessoa.email = email; 
      objPessoa.telefone = telefone; 
      objPessoa.login = login; 
      objPessoa.senha = senha; 
      objPessoa.cpf = cpf; 
      objPessoa.dtnasc = dtnasc; 
      objPessoa.rg = rg; 
      objPessoa.incluir(); 
   } 

   [WebMethod] 
   public void incluirPJ(string nome, string email, string telefone, string login, string senha,
                         string cnpj, string razao_social, string insc_estadual) 
   { 
      clsPessoaJur objPessoa = new clsPessoaJur(); 
      objPessoa.nome = nome; 
      objPessoa.email = email; 
      objPessoa.telefone = telefone; 
      objPessoa.login = login; 
      objPessoa.senha = senha; 
      objPessoa.cnpj = cnpj; 
      objPessoa.razao_social = razao_social; 
      objPessoa.insc_estatual = insc_estadual; 
      objPessoa.incluir(); 
   } 

   [WebMethod] 
   public void alterarPF(long cod, string nome, string email, string telefone, string login,
  string senha, string cpf, DateTime dtnasc, string rg) 
   { 
      clsPessoaFis objPessoa = new clsPessoaFis(); 
      objPessoa.cod = cod; 
      objPessoa.nome = nome; 
      objPessoa.email = email; 
      objPessoa.telefone = telefone; 
      objPessoa.login = login; 
      objPessoa.senha = senha; 
      objPessoa.cpf = cpf; 
      objPessoa.dtnasc = dtnasc; 
      objPessoa.rg = rg; 
      objPessoa.alterar(); 
   } 

   [WebMethod] 
   public void alterarPJ(long cod, string nome, string email, string telefone, string login,
                         string senha, string cnpj, string razao_social, string insc_estadual) 
   { 
      clsPessoaJur objPessoa = new clsPessoaJur(); 
      objPessoa.cod = cod; 
      objPessoa.nome = nome; 
      objPessoa.email = email; 
      objPessoa.telefone = telefone; 
      objPessoa.login = login; 
      objPessoa.senha = senha; 
      objPessoa.cnpj = cnpj; 
      objPessoa.razao_social = razao_social; 
      objPessoa.insc_estatual = insc_estadual; 
      objPessoa.alterar(); 
   } 

   [WebMethod] 
   public DataSet obterPF(long cod) 
   { 
      clsPessoa objPessoa = new clsPessoaFis(); 
      objPessoa.cod = cod; 
      return objPessoa.obter(); 
   } 

   [WebMethod] 
   public DataSet obterPJ(long cod) 
   { 
      clsPessoa objPessoa = new clsPessoaJur(); 
      objPessoa.cod = cod; 
      return objPessoa.obter(); 
   } 

   [WebMethod] 
   public void excluir(long cod) 
   { 
      clsPessoa objPessoa = new clsPessoaFis(); 
      objPessoa.cod = cod; 
      objPessoa.excluir(); 
   } 

   [WebMethod] 
   public long autenticar(string login, string senha) 
   { 
      clsPessoa objPessoa = new clsPessoaFis(); 
      objPessoa.login = login; 
      objPessoa.senha = senha; 
      long cod = objPessoa.autenticar(); 
      return cod; 
   } 
} 

Já estamos quase no final do nosso projeto, mas antes gostaria de destacar o DataSet de retorno do método obter. A classe DataSet é a mais importante da biblioteca de acesso a dados ADO.NET. Por esta tecnologia ser totalmente baseada em XML (o qual a difere totalmente da sua antecessora, o ADO) ela retorna um documento XML a partir de um comando select (por exemplo) em um banco de dados, sem a necessidade de se criar um documento XML de retorno "na mão". Esta é apenas uma das várias inovações que a tecnologia ADO.NET trouxe para os desenvolvedore .NET.

É importante lembrar que em todos as implementações acima (classes e webservice) temos que adicionar alguns namespaces utilizados:

using System.Data;
using System.Data.OleDb;
using System.Text; 

Agora é só ver e testar o resultado do nosso webservice, acessando o mesmo através do browser:

Testando o método obterPF:

Ufa! Chegamos ao fim da construção do nosso webservice. Este exemplo nos ajudou a demonstrar na prática alguns conceitos de OO que aproximam as nossas soluções ao mundo real.

No próximo artigo, estaremos criando uma página ASP.NET que "consumirá" o nosso webservice, ou seja, utilizará os métodos públicos disponíveis para manipulação do nosso cadastro de clientes na web.

Clique aqui para baixar o código fonte completo do nosso projeto.

Um abraço,

Jones

Jones Avelino

Jones Avelino - Bacharel em Sistemas de Informação e com especialização em Desenvolvimento de Sistemas para Internet, trabalha como Analista / Desenvolvedor de sistemas Web sendo especialista em ASP, ASP.NET e SQL Server.