C# - Kép küldése mellékletként, és a módosított kép fogadása a szervizalkalmazásból

forráskód letöltése
A Web Services Enhancements for Microsoft .NET (WSE) 2.0-ás verziója számtalan újdonsággal rendelkezik az 1.0-ás verzióhoz képest. Könnyebben küldhetünk SOAP üzeneteket a szervizeknek, és egyszerűbbé vált az onnan érkező üzenet feldolgozása is. Kifejezetten hasznos, hogy a meglévő funkciókon is egyszerűsítettek, így néhány metódushívás elegendő bizonyos feladatok elvégzéséhez. Cikkünkben az objektumcsatolás lehetőségeit vizsgáljuk meg abban a tekintetben, hogy miként mozgathatunk képobjektumot az alkalmazások között mindkét irányba.
Mellékelt példa megnyitása előtt szükséges egy WSEService nevű virtuális könyvtár létrehozása, mely a példa könyvtárában található WSEService mappára mutat. Ehhez futtassa le a mellékelt CreateVD.js parancsállományt. A mellékelt példa használatához telepítenünk kell a Microsoft WSE 2.0 csomagot. Ennek elvégzéséhez olvassa el a Kezdeti lépések című fejezetet.
Kezdeti lépések
A Microsoft által elkészített csomag a Web Services Enhancements for Microsoft .NET nevet viseli, és cikkünk írásakor a következő webcímen volt elérhető, mely azóta természetesen megváltozhatott:
http://www.microsoft.com/downloads/details.aspx?displaylang=en&familyid=21fb9b9a-c5f6-4c95-87b7-fc7ab49b3edd
Letöltve az állományt (WSE20TP.exe) telepítenünk kell a .NET Framework alá. Az öntelepítő állomány erről gondoskodik, a használható .DLL állomány (Microsoft.Web.Services.dll), és a kapcsolódó dokumentáció alapértelmezésben a következő mappába kerül: %winroot%:\Program Files\Microsoft WSE\v2.0\.
A telepített assembly bekerül a globális assembly-listába, így amikor referenciaként megadjuk alkalmazásainkban, akkor a globális palettáról kell kiválasztanunk, nem pedig valamilyen alternatív mappából.
A projektek mindegyikében meg kell adni referenciaként a Microsoft.Web.Service.dll assembly-t, mely már telepítéskor a GAC-ba került, így a .NET fül alatti listából kiválasztható.
Szervizalkalmazás elkészítése
A szervizalkalmazás egy webes metódussal rendelkezik, melyet meghívunk a kliensből annak érdekében, hogy az onnan érkező képobjektumot módosítva megkaphassuk, és megjelenítsük a kliensalkalmazás felületén.
A metódus neve GetBitmap. A klienstől kapott képet egy Bitmap objektumban tárolja, majd ezt módosítja olyan módon, hogy a képre egy sárga hátterű piros felirat kerüljön. A módosított képet – azzal a módszerrel, ahogyan kapta is – visszaküldi a kliensnek, amely megjeleníti.
Ennek érdekében először létrehozunk egy Bitmap objektumot a módosított kép számára, valamint egy adatfolyamot.
Bitmap modified = null;
FileStream fs = File.Create(Server.MapPath("Modified.bmp"));
Amennyiben a SOAP üzenet tartalmaz mellékletet, akkor az adatfolyamból generálunk egy képet, melyet a Manipulate metódussal módosítunk.
StreamReader stream = new StreamReader(RequestSoapContext.Current.Attachments[0].Stream);
Bitmap bmp = new Bitmap(stream.BaseStream);
modified = Manipulate(bmp);
A képet elmentjük a szerviz mappájába.
modified.Save(fs,ImageFormat.Gif);
Ezt követően a melléklet számára létrehozunk egy DimeAttachment objektumot.
DimeAttachment a = new DimeAttachment("image/gif",TypeFormatEnum.MediaType,fs);
Majd a klienshez küldendő válasz SOAP üzenet mellékleteinek listájában helyezzük el.
ResponseSoapContext.Current.Attachments.Add(a);
A kliensalkalmazás elkészítése
A kliensalkalmazás esetén egy webes referenciát kell adnunk a szerviz URL-jére mutatva, majd el kell küldenünk a projekt mappájában található Sample.jpg képet a szervizhez, a proxy osztály segítségével.
A kód hihetetlenül egyszerű. Első lépés a proxy példányosítása.
localhost.ServiceClass proxy = new localhost.ServiceClass();
A következő, hogy létrehozunk egy melléklet-objektumot.
DimeAttachment attachment = new DimeAttachment("image/gif",TypeFormatEnum.MediaType,path);
Ezt követően elküldjük a képet a szerviznek.
proxy.RequestSoapContext.Attachments.Add(attachment);
Meghívjuk a szerviz metódusát, mely ezzel utasítást kap a kép módosítására, valamint a módosított kép visszajuttatására.
proxy.GetBitmap();
Ezt követően – amennyiben a kapott üzenetfolyam tartalmaz mellékletet – kihámozzuk a képmellékletet, és megjelenítjük azt a PictureBox kontrolban.
if (proxy.ResponseSoapContext.Attachments.Count == 1)
{
  pictureBox1.Image = new Bitmap(proxy.ResponseSoapContext.Attachments[0].Stream);
}
A mellékletképzés és -küldés elengedhetetlen funkciója a WSE csomagnak, hiszen a webes metódusok nem kaphatnak képobjektumot paraméterként, és vissza sem adhatnak képet. Ennek egy oka van: a Bitmap objektum nem rendelkezik alapértelmezett konstruktorral, így nem szerializálható.