Web Services
WEB Services e tipos definidos pelo usuário
Neste artigo vamos ver como utilizar tipos próprios em serviços WEB. Utilizar tipos próprios em serviços WEB pode ser considerado por alguns, algo paradoxal. De certa maneira é mesmo. Veja a questão da distribuição. Um dos objetivos do WEB service é tornar o cliente mais fácil de distribuir. Usar tipos próprios em serviços WEB pode obrigá-lo a distribuir seus assemblies tanto no cliente quanto no servidor em um aplicativo Windows, por exemplo.
De fato, em todo tempo que trabalho com a plataforma .Net
houve apenas dois casos em que precisei abrir mão deste recurso. Em
ambos os casos já havia uma ampla camada de modelos baseada em tipos
próprios. Tipos estes que precisavam ser utilizados nos dois extremos
dos aplicativos.
Mão na massa
Para começar vamos criar dois projetos. Um para o serviço WEB, que vamos chamar de CustomerService e outro para nossa biblioteca de classes que conterá nossos modelos. Vamos chamar este último de WSWithMyOwnTypes.Model. A sua solution Explorer deve estar como a da Figura 1.
Listagem 1. Modelagem de um cliente no projeto WSWithMyOwnTypes.Model.
using System;
using System.Collections.Generic;
using System.Text;
namespace Palladino.Articles.WSWithMyOwnTypes
{
public class Customer
{
private string name;
//Apenas estado, por enquanto
public string Name
{
get { return this.name; }
set { this.name = value; }
}
}
}

Figura 1. Solution Explorer
Listagem 2. Serviço WEB simples para usar um cliente no projeto WSWithMyOwnTypes.CustomerService.
using System;
using System.Data;
using System.Web;
using System.Collections;
using System.Web.Services;
using System.Web.Services.Protocols;
using System.ComponentModel;
namespace Palladino.Articles.WSWithMyOwnTypes
{
[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[ToolboxItem(false)]
public class CustomerService : System.Web.Services.WebService
{
[WebMethod]
public string MakeSomethingWithCustomer(Customer customer)
{
//Apenas utiliza o estado de 'customer' para o
//retorno do método
return customer.Name;
}
}
}
Observação
Este fragmento de código utiliza o namespace http://tempuri.org/
para o serviço. A técnica mostrada neste artigo depende desta
informação, de forma que você deve dar bastante atenção a isto quando
for implementar os seus próprios serviços. O código fonte usado como
exemplo para este artigo utiliza o namespace http://palladino.com.br.
Vamos criar mais um projeto, desta vez uma aplicação Windows, para consumir o serviço CustomerService. Vamos chamar este novo projeto de
WSWithMyOwnTypes.CustomerServiceConsumer. Este projeto conterá uma referência para o serviço (Web Reference) e outra para a biblioteca de modelos. Observe a Figura 2 que representa o seu Solution Explorer

Figura 2. Solution Explorer
No
formulário deste aplicativo, depois que a referência WEB tiver sido
adicionada adequadamente, vamos criar um botão e manipular o seu evento
Click conforme indicado na Listagem 3.
Listagem 3. Fazendo a chamada do serviço WEB (com erro de compilação)
private void button1_Click(object sender, EventArgs e)
{
MyServices.CustomerService service = new
MyServices.CustomerService();
Customer anyCustomer = new Customer();
anyCustomer.Name = "Um cliente qualquer";
MessageBox.Show(service.MakeSomethingWithCustomer(anyCustomer));
}
Ao tentar compilar este código vamos receber a seguinte mensagem de erro:
|
The best overloaded method match for Palladino.Articles.WSWithMyOwnTypes
.MyServices.CustomerService.MakeSomethingWithCustomer(Palladino.Articles
.WSWithMyOwnTypes.
MyServices.Customer)' has some invalid arguments. |
...
Exibição do post interrompida. Para ler conteúdo completo,
clique aqui