Você está na página 1de 10

Trafegando Imagens através de Web Service dentro do Smart Device Extensions com Visual

Studio .NET 2003.


Autor: Maycol Sneider Romelli

Descrição: 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.

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.

Figura1. Criando a aplicação PocketBikes


Figura2. Criando o WebService ProducService

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.

Figura3. 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.IO;
using System.Drawing;
using System.Collections;
using System.Windows.Forms;
using System.Data;

namespace PocketBikes
{
/// <summary>
/// Summary description for Form1.
/// </summary>
public class Form1 : System.Windows.Forms.Form
{
private System.Windows.Forms.DataGrid dataGrid1;
private System.Windows.Forms.PictureBox pictureBox1;
private System.Windows.Forms.MainMenu mainMenu1;

DownhillBikes.ProductService ws;
bool online = true;
Bitmap imageMissing;
string cacheFolder;
string curId;

private DataSet GetProductList()


{
DataSet ds = new DataSet();
try
{
if (online)
{
// Usa XML Web Service para trazer a lista de produtos
ws = new DownhillBikes.ProductService();
ws.Timeout = 5000;
ds = ws.GetProducts();

// Salva a lista de produtos em cache


ds.WriteXml(Path.Combine(cacheFolder, "Products.xml"));
}
}
catch
{
online = false;
string offlineCache = Path.Combine(cacheFolder, "Products.xml");

// Traz a lista de produtos para cache


if (File.Exists(offlineCache))
ds.ReadXml(offlineCache);
}

return ds;
}

private void CreateMissingImage()


{
const string message = "Imagem não existente";

// Cria um bitmap
imageMissing = new Bitmap(pictureBox1.Width, pictureBox1.Height);

// Objetos GDI
Font font = new Font("Arial", 9, FontStyle.Bold);

// Draw do bitmap
Graphics g = Graphics.FromImage(imageMissing);
g.Clear(Color.White);
SizeF size = g.MeasureString(message, font);
g.DrawString(message, font,
new SolidBrush(Color.Gray),
(pictureBox1.Width - size.Width) / 2,
(pictureBox1.Height - size.Height) / 2);
}
public Form1()
{
//
// Required for Windows Form Designer support
//
InitializeComponent();
//
// TODO: Add any constructor code after InitializeComponent call
//
}
/// <summary>
/// Clean up any resources being used.
/// </summary>
protected override void Dispose( bool disposing )
{
base.Dispose( disposing );
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
this.mainMenu1 = new System.Windows.Forms.MainMenu();
this.dataGrid1 = new System.Windows.Forms.DataGrid();
this.pictureBox1 = new System.Windows.Forms.PictureBox();
//
// dataGrid1
//
this.dataGrid1.Size = new System.Drawing.Size(240, 120);
this.dataGrid1.Text = "dataGrid1";
this.dataGrid1.CurrentCellChanged += new System.EventHandler(this.dataGrid1_CurrentCellChanged);
//
// pictureBox1
//
this.pictureBox1.Location = new System.Drawing.Point(0, 127);
this.pictureBox1.Size = new System.Drawing.Size(240, 137);
this.pictureBox1.SizeMode = System.Windows.Forms.PictureBoxSizeMode.CenterImage;
//
// Form1
//
this.Controls.Add(this.pictureBox1);
this.Controls.Add(this.dataGrid1);
this.Menu = this.mainMenu1;
this.MinimizeBox = false;
this.Text = "PocketBikes";
this.Load += new System.EventHandler(this.Form1_Load);
}
#endregion

/// <summary>
/// The main entry point for the application.
/// </summary>

static void Main()


{
Application.Run(new Form1());
}

private void Form1_Load(object sender, System.EventArgs e)


{
// Cria a imagem em memória
CreateMissingImage();

// setup the cache folder


cacheFolder = Path.Combine(Path.GetDirectoryName(
System.Reflection.Assembly.GetExecutingAssembly().
GetName().CodeBase), "Cache");
Directory.CreateDirectory(cacheFolder);

// Traz a lista de produtos do Web Service ou local cache DataSet ds = GetProductList();

// Carrega a lista de produtos no DataGrid


if (ds.Tables.Count == 0)
MessageBox.Show("Could not connect to Web service and local cache is not available.");
else
{
dataGrid1.DataSource = ds.Tables[0];
dataGrid1.TableStyles.Add(new DataGridTableStyle());
dataGrid1.TableStyles[0].MappingName = ds.Tables[0].TableName;
dataGrid1.TableStyles[0].GridColumnStyles[1].Width = 102;
}
}

private void dataGrid1_CurrentCellChanged(object sender, System.EventArgs e)


{
// Processo de selecionamento do Produto
string productId = dataGrid1[dataGrid1.CurrentRowIndex, 0].ToString();
if (productId == curId)
return;
curId = productId;

try
{
// Carrega a imagem do Produto em cache
string cacheImage = Path.Combine(cacheFolder, productId + ".gif");
if (File.Exists(cacheImage))
pictureBox1.Image = new Bitmap(cacheImage);
else if (online)
{
Cursor.Current = Cursors.WaitCursor;

// Traz a imagem do Web Service


MemoryStream stream = new MemoryStream(ws.GetImage(productId));
pictureBox1.Image = new Bitmap(stream);

// Salva a imagem em cache local (nota: Image.Save não é suportado no .NET CF)
FileStream fs = new FileStream(cacheImage, FileMode.Create);
byte[] bytes = stream.ToArray();
fs.Write(bytes, 0, bytes.Length);
fs.Close();
stream.Close();

Cursor.Current = Cursors.Default;
}
else
pictureBox1.Image = imageMissing;
}
catch
{
online = false;
pictureBox1.Image = imageMissing;
}
}
}
}

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.
Figura4. 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.
Figura5. Utilizando o emulador para execução da aplicação
Figura6. 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...

Sobre o Autor
Maycol Sneider Romelli é integrante do Seminar Group 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 e Site Linha de Código. Colaborou também com as
extintas revistas .NET Magazine e VSPJ.

Você também pode gostar