
Mellékelt példa megnyitása előtt szükséges egy SmartService nevű virtuális könyvtár létrehozása, mely a példa könyvtárában megtalálható SmartService mappára mutat. Ehhez nyissa meg a mellékelt mappa Tulajdonság ablakát és itt a Webmegosztás lapon engedélyezze a mappa megosztását olvasási és parancsfájlok futtatási jogával.
A szerviz alkalmazás futtatása előtt gondoskodnunk kell arról, hogy a Web szerver virtuális mappájában engedélyezzük a névtelen hozzáférést.
A példa fordítása után futtassa le a mellékelt AddRegistry.reg állományt a Rendszerleíró adatbázis bejegyzéseinek elkészítéséhez.
Első lépésként telepítenünk kell a Microsoft WSE 1.0 csomagot. Ennek elvégzéséhez olvassa el a Kezdeti lépések című fejezetet.
A feladatban három modult készítünk el, melyek szükségesek egy tetszőleges, a szerviz megfelelő mappájában található kép valamelyikének lekéréséhez, és beillesztéséhez.
A SmartService projekt tartalmazza a szerviz alkalmazás kódját, mely válaszolva a SOAP kérésre, eljuttatja a kért képet a klienshez.
A SmartForm projektünk egy űrlap kódját tartalmazza, mely lekérdezi a szerveren található képek listáját, és megjeleníti azok nevét egy listában, melyből ezt követően a felhasználó kiválaszthatja a megfelelőt.
A SmartTag projektünk pedig tartalmazza a címke kódját, mely egy adott képet beilleszt a dokumentum aktuális kurzorpozíciójába. A címke menüpontjai közül az elsővel listából választhatjuk a képet, míg a második menüpontra kattintva a szerviz képlistájából az elsőt illeszthetjük be.
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 természetesen megváltozhatott: http://msdn.microsoft.com/webservices/building/wse/default.aspx.
Letöltve az állományt (Web Services Enhancements 1.0 for Microsoft .NET.msi) 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\v1.0.2312\.
SmartService projekt
A WSE csomag névtereinek eléréséhez referenciaként mind a kliens, mind a szerver-alkalmazásokban meg kell adni a Microsoft.Web.Services.dll állományt. Ehhez válasszuk a Project - Add reference menüpontot, majd a megjelenő ablakban a .NET lapon keressük elő a Microsoft.Web.Services.dll elemet.
A szerviz három metódust tartalmaz. A GetImageList metódus egy karaktertömbben adja vissza a szerveren elérhető képek listáját.
A GetImage és GetNamedImage metódusokkal egy-egy képet küldhetünk el a kliensnek. A kettő között csak az a különbség, hogy az utóbbi egy paraméterben megkapja a küldendő kép nevét. Ez utóbbi szolgál arra, hogy a megjelenő űrlapon kiválasztott kép kerüljön beillesztésre. A metódus SOAP csatolt fájlként hozzáadja a képet a visszatérő bájtfolyamhoz.
[WebMethod]
public void GetNamedImage(string fname)
{
string attfile = this.Server.MapPath("Images\\" + fname);
Létre kell hozni egy SoapContext objektumot, melynek segítségével kezelhetjük a SOAP üzeneteket:
SoapContext rContext = HttpSoapContext.ResponseContext;
Létre kell hoznunk a csatolt állomány objektumát, melyben specifikálnunk kell az állomány típusát:
DimeAttachment attachment = new DimeAttachment("image/gif", TypeFormatEnum.MediaType,attfile);
Majd fel kell fűzni a csatolt állományok listájára:
rContext.Attachments.Add(attachment);
}
Web.confg állomány módosítása
A szerviz alkalmazásunkat konfigurálnunk kell annak érdekében, hogy helyesen értelmezze a kliens kéréseit. A <system.web></ system.web > elemeken belül be kell illesztenünk a következő sorokat:
<webServices>
<soapExtensionTypes>
<add type="Microsoft.Web.Services.WebServicesExtension,Microsoft.Web.Services,Version=1.0.0.0,Culture=neutral,PublicKeyToken=31bf3856ad364e35" priority="1" group="0"/>
</soapExtensionTypes>
</webServices>
Egyetlen lényeges elvárás ezzel kapcsolatban, hogy a type attribútumban megadott karakterlánc egy sorban legyen megadva.
Webes referenciák
Mind a címke, mind a megjelenő űrlap esetén egy-egy Webes referenciát kell megadnunk a Web szerviz alkalmazás eléréséhez, a proxy osztály létrehozásához.
A projektek gyorsmenüjében válasszuk a Web Reference menüpontot, majd a megjelenő ablak Address mezőjében adjuk meg a szervizünk eléréséhez szükséges URL-t, mely jelen esetben a következő:
http://localhost/SmartService/SmartService.asmx
A két projekt mappájában létrejön egy Web Reference alkönyvtár, ebben pedig egy localhost mappa. A mappában találunk egy Reference.cs állományt, mely a proxy kódját tartalmazza. A kódban helyezzük el a WSE névterére hivatkozó referenciát.
using Microsoft.Web.Services;
Majd a SService osztályt származtassuk a WebServicesClientProtocol osztályból.
SmartForm projekt
A címke két menüpontja közül az elsőre kattintva megjelenik a projekt generálta űrlap, melyben egy lista tartalmazza a beilleszthető képek nevét. A szerviz eléréséhez létrehozunk egy proxy példányt, majd meghívjuk a szerviz megfelelő metódusát mind a listázáshoz, mind a kép lekérdezéséhez.
svc = new localhost.SService();
...
A megadott névvel rendelkező kép lekérdezéséhez pedig meghívjuk a GetNamedImage metódust.
svc.GetNamedImage(listBox1.SelectedItem.ToString());
Majd ki kell olvasni a csatolt állományt, és be kell tölteni a PictureBox-ba:
if (svc.ResponseSoapContext.Attachments.Count == 1)
{
pictureBox1.Image = new Bitmap(svc.ResponseSoapContext.Attachments[0].Stream);
}
A csatolt állományok száma nagyobb is lehet mint egy, azonban itt csak egy állományt tudunk felhasználni, így ellenőriznünk kell a mennyiséget.
A dialógusablak gombjára kattintva kimásolhatjuk a PictureBox kontrolban megtalálható képet a Vágólapra a Clipboard objektum segítségével, majd bezárjuk a dialógusablakot.
Clipboard.SetDataObject(pictureBox1.Image);
Close();
SmartTag projekt
A címke RecognizeClass osztályának Recognize metódusában végezzük el a „kép” szó azonosítását, majd kijelölését.
int i = Text.ToLower().IndexOf("kép");
if (i >= 0)
{
RecognizerSite.CommitSmartTag(smartTagName, i+1, 3, RecognizerSite.GetNewPropertyBag());
}
Az ActionClass osztályban a get_VerbCount metódusában megadjuk, hogy két menüpontot tartalmaz a felismert szóra kattintáskor felbukkanó menü.
public int get_VerbCount(string SmartTagName)
{
if (SmartTagName=="softwareonline#smarttag")
{
return 2;
}
...
}
A menüpontok feliratait a get_VerbCaptionFromID metódusban adjuk meg.
string s="";
switch (VerbID){
case 1:
s = "Kép választása listából";
break;
case 2:
s = "Kép beillesztése közvetlenül";
break;
}
return s;
Az InvokeVerb metódusban megadjuk az egyes menüpontok választásakor végzendő feladatok kódját.
Az első menüpont választásakor megjelenítjük a SmartForm projekt űrlapját, és az ott kiválasztott képet illesztjük be.
switch (VerbID)
{
case 1:
Form1 f = new Form1();
f.ShowDialog();
wr.Paste();
break;
A második menüpont választásakor a proxy osztályt példányosítjuk, majd a GetImage metódusát hívjuk meg.
case 2:
svc = new localhost.SService();
svc.GetImage();
Itt is egy PictureBox objektumban helyezzük el a kapott képet, annak ellenére, hogy itt nem jeleníthetjük meg azt.
pb.Image = new Bitmap(svc.ResponseSoapContext.Attachments[0].Stream);
A képet kimásoljuk a Vágólapra, majd beillesztjük a dokumentumba.
Clipboard.SetDataObject(pb.Image);
wr.Paste();
...
}
A beillesztett kép minden esetben a jelölt szó helyére kerül.