Desenvolvimento - Web Services

Trafegando Imagens através de Web Service dentro do Smart Device Extensions com Visual Studio .NET 2003

Neste artigo exploraremos uma grande funcionalidade que facilitará em muito a vida dos desenvolvedores, o trafego de imagens através de Web Service dentro do Smart Device Extensions.

por Maycol Sneider Romelli



Com o lançamento do Visual Studio .NET 2003 no evento do PDC (Professional Developer Conference 2003 ) ocorrido nos dias 22 e 23 de maio a Microsoft traz duas novas características ao produto o Smart Device Extensions com o .NET Compact Framework e o J#.Neste artigo exploraremos uma grande funcionalidade que facilitará em muito a vida dos desenvolvedores, o trafego de imagens através de Web Service dentro do Smart Device Extensions.

Criando a aplicação

Nosso artigo será composto por dois projetos; o primeiro será um Web Service de nome ProductService e o segundo uma aplicação de nome PocketBikes.Ambos os projetos serão desenvolvidos em C# e a aplicação PocketBikes consumirá o Web Service ProductService.Visualizaremos a tabela Products do banco de dados Bikes dentro de uma datagrid e as respectivas fotos de cada produto em uma picturebox.

Criando a aplicação PocketBikes

Figura 1: Criando a aplicação PocketBikes

Criando o WebService ProductService

Figura 2: Criando o WebService ProductService

Criando o Web Service ProductService

Nosso Web Service faz o uso do banco de dados Bikes, que você pode atachá-lo no seu SQL Server 2000 (Database/All Tasks/Attach Database) Bikes.mdf.O Web Service a ser criado conterá dois Web Methods de nome GetProducts() e GetImage(), a seguir segue o código para criação do Web Service ProductService:

using System;
using System.Configuration;
using System.Data;
using System.Data.SqlClient;
using System.Drawing;
using System.Drawing.Imaging;
using System.IO;
using System.Web.Services;

namespace DownhillBikes
{
	/// <summary>
	/// Expõe a relação de produtos através dos Web Methods.
	/// </summary>
	[WebService(
	Description="Exposes product-related Web service methods.",
	Namespace="http://localhost/DownhillBikes")]
	public class ProductService : WebService
	{
		private static string connString = ConfigurationSettings.AppSettings["BikesConnection"];

		[WebMethod(CacheDuration=60)]
		public DataSet GetProducts()
		{
			using (SqlConnection con = new SqlConnection(connString))
			{
				// Query em Products
				SqlDataAdapter da = new SqlDataAdapter(
				"SELECT ProductID as ID, ProductName as Product, "$" + convert(varchar(10), UnitPrice, 1) as Price FROM Products", con);						// Retorna um dataset de todos os produtos
				DataSet ds = new DataSet();
				da.Fill(ds);
				return ds;
			}
		}

		[WebMethod]
		public byte[] GetImage(string productId)
		{
			using (SqlConnection con = new SqlConnection(connString))
			{
				// Query das Imagens dos Produtos
				SqlCommand cmd = new SqlCommand(
				"SELECT ImagePath from Products where ProductID = " + productId, con);
		
				con.Open();
		
				// Retorna o Path da Imagem
				string path = Path.Combine(Server.MapPath(@".\"), (string)cmd.ExecuteScalar());
				Image image = new Bitmap(path);
	
				// Gerador thumbnail para a imagem
				Image thumbnail = image.GetThumbnailImage(
					(int)(image.Width * 0.65F), 
					(int)(image.Height * 0.65F), 
					null, IntPtr.Zero);

				// Salva a imagem para stream
				MemoryStream stream = new MemoryStream();
				thumbnail.Save(stream, ImageFormat.Gif);

				// Retorna uma Array de Bytes
				return stream.GetBuffer();
			}
		}
	}
}

Visualizando o código acima você perceberá que é necessário criar dentro do arquivo web.config uma key de nome BikesConnection consumida através de ConfigurationSettings.AppSettings["BikesConnection"]; a seguir inclua o código abaixo dentro do web.config.

<appSettings>
   <add key="BikesConnection" value="server=localhost;database=Bikes;integrated security=SSPI;" />    
</appSettings>

O Web Method GetProducts() retorna todos os produtos que tem dentro da tabela Products do banco de dados Bikes e o Web Method GetImage() recebe como parâmetro uma string que é o código do produto e retorna um MemoryStream com a foto de cada produto.

Criando a Aplicação PocketBikes

Após o Web Service criado iniciaremos o desenvolvimento da aplicação que consiste de uma datagrid e uma picturebox.A datagrid será responsável por mostrar todos os produtos da tabela Products, e a picturebox o objeto responsável por mostrar as fotos dos produtos.A figura 3 mostra os dois controles usados no formulário.

O formulário com a datagrid e a picturebox

Figura 3: O formulário com a datagrid e a picturebox

Após o formulário criado daremos início a codificação conforme código abaíxo:

using System;
using System.Configuration;
using System.Data;
using System.Data.SqlClient;
using System.Drawing;
using System.Drawing.Imaging;
using System.IO;
using System.Web.Services;

namespace DownhillBikes
{
	/// <summary>
	/// Expõe a relação de produtos através dos Web Methods.
	/// </summary>
	[WebService(
	Description="Exposes product-related Web service methods.",
	Namespace="http://localhost/DownhillBikes")]
	public class ProductService : WebService
	{
		private static string connString = ConfigurationSettings.AppSettings["BikesConnection"];

		[WebMethod(CacheDuration=60)]
		public DataSet GetProducts()
		{
			using (SqlConnection con = new SqlConnection(connString))
			{
				// Query em Products
				SqlDataAdapter da = new SqlDataAdapter(
				"SELECT ProductID as ID, ProductName as Product, "$" + convert(varchar(10), UnitPrice, 1) as Price FROM Products", con);

				// Retorna um dataset de todos os produtos
				DataSet ds = new DataSet();
				da.Fill(ds);
				return ds;
			}
		}

		[WebMethod]
		public byte[] GetImage(string productId)
		{
			using (SqlConnection con = new SqlConnection(connString))
			{
				// Query das Imagens dos Produtos
				SqlCommand cmd = new SqlCommand(
				"SELECT ImagePath from Products where ProductID = " + productId, con);

				con.Open();

				// Retorna o Path da Imagem
				string path = Path.Combine(Server.MapPath(@".\"), (string)cmd.ExecuteScalar());
				Image image = new Bitmap(path);

				// Gerador thumbnail para a imagem
				Image thumbnail = image.GetThumbnailImage(
					(int)(image.Width * 0.65F), 
					(int)(image.Height * 0.65F), 
					null, IntPtr.Zero);

				// Salva a imagem para stream
				MemoryStream stream = new MemoryStream();
				thumbnail.Save(stream, ImageFormat.Gif);

				// Retorna uma Array de Bytes
				return stream.GetBuffer();
			}
		}
	}
}

Salve o formulário e adicione o Web Service a seu projeto Add Web Reference passando como endereço http://157.57.236.53/DownhillBikes/ProductService.asmx ( adicione uma Microsoft Loopback Adapter IP 157.57.236.53 )

Quando o formulário é carregado, a datagrid será preenchida com todos os produtos oriundos do retorno do Web Method GetProducts(), com isso a cada item selecionado na datagrid a picturebox mostrará a foto do produto escolhido.

Mostra o Web Service Adicionado ao projeto PocketBikes

Figura 4: Mostra o Web Service Adicionado ao projeto PocketBikes

Executando a aplicação

Após tudo pronto executaremos a aplicação clicando em F5 e utilizando o emulador para deployment Pocket PC 2003 - SDK Emulator.

Utilizando o emulador para execução da aplicação

Figura 5: Utilizando o emulador para execução da aplicação

Visualizando a aplicação

Figura 6: Visualizando a aplicação

Conclusão

Neste artigo, nós vimos como ler e gravar XML, como trabalhar em local cache, utilizar bitmap e memorystream e trafegar fotos através de Web Services usando o SDE do Visual Studio .NET 2003.

Até o próximo artigo.

Maycol Sneider Romelli

Maycol Sneider Romelli - Integrante de D&PE da Microsoft Brasil, aonde ministra palestras na área de desenvolvimento, é também escritor de várias revistas e sites no Brasil como: Revista MSDN Magazine, Revista Desenvolvedor, Revista SQL Magazine, Revista Developers Magazine, Site MSDN Brazil, Site Linha de Código e Site Portal Web Mobile. Colaborou também com as extintas revistas .NET Magazine e VSPJ.