A feladat viszonylag egyszerű: szükségünk lesz egy Bitmap-re, melyet betölthetünk akár állományból, de generáltathatunk a programmal is. Ezt a Bitmap-et lementjük egy memória stream-re, majd ezt a memória területet egyszerűen visszatérési értékként adjuk a web method-nak, mely bájtokat tartalmazó tömböt ad vissza.
A kliens oldalon ezt a tömböt szintén egy memória stream segítségével visszaalakítjuk Bitmap-é és megjelenítjük.
A Web Service létrehozása után készítsünk egy GetPicture nevű függvényt, mely bájtokat tartalmazó tömböt ad vissza.
[WebMethod]
public byte[] GetPicture()
{
A Bitmap-et most programból generáltatjuk, de állományból is betölthetnék.
Bitmap bmp = new Bitmap(101, 101);
...
A létrejött képet mentjük egy MemoryStream objektumba.
MemoryStream ms = new MemoryStream();
bmp.Save(ms, ImageFormat.Bmp);
A függvény visszatérési értékeként pedig a memória stream GetBuffer függvénye által adott területet adjuk, mely tartalmazza a képet. Ez a memória tartalom base64binary kódolással kerül átadásra a hívó félnek.
A Web Service elkészülte után fordítsuk le azt, majd hozzunk létre egy Windows-os alkalmazást. Szükségünk lesz egy proxy osztályra, melyen keresztül a Web Service-t könnyedén elérhetjük. Ehhez a WSDL.EXE parancssori alkalmazás segít bennünket. Ha kiadjuk az alábbi utasítást, akkor létrejön egy Service1.cs forráskód, melyben adott lesz a Web Service eléréséhez szükséges objektum.
wsdl http://localhost/PictureService/Service1.asmx?wsdl
A localhost helyett természetesen más is állhat attól függően, hogy a Web Service hol lett publikálva. A WSDL könnyebb eléréséhez használjuk a Visual Studio.NET Command Propmt-ot.
A létrejövő Service1.cs-t vegyük fel az új Windows-os projekthez.
A GetPicture függvény eléréshez hozzunk létre egy új objektumot a Service1 osztályból.
private void button1_Click(object sender, System.EventArgs e)
{
Service1 s = new Service1();
byte[] buffer = s.GetPicture();
A GetPicture által adott bájtokat tartalmazó tömböt tároljuk egy memória stream-en.
MemoryStream ms = new MemoryStream();
ms.Write(buffer, 0, buffer.Length);
Ezt követően létrehozunk egy Bitmap osztályt, melyhez a memória stream-en lévő adatokat használjuk fel.
Bitmap bmp = new Bitmap(ms);
Miután a Bitmap osztály létrejött már szabadon felhasználhatjuk a kapott képet.
Graphics g = Graphics.FromHwnd(Handle);
g.DrawImage(bmp, 30, 50);
}