
Mellékelt példa megnyitása előtt szükséges egy SoapHeaderUsage nevű virtuális könyvtár létrehozása, mely a példa könyvtárá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.
SOAP üzenet
A .NET osztálykönyvtára számtalan megoldást kínál arra, hogy alkalmazásaink valamilyen szoftvercsatornán kommunikáljanak egymással. Napjaink igazán rugalmas, XML-alapú kommunikációs megoldása a SOAP szabvány kínálta lehetőség, mely biztonságos is egyben. Az üzenetek könnyen felépíthetőek, feldolgozhatóak.
Az üzenet tartalma, és formai megkötései tehát XML-formátumban jutnak el a szerverhez, leggyakrabban egy Web szerviz alkalmazáshoz, majd onnan a válasz is ebben a formátumban érkezik vissza.
A SOAP üzenet legfontosabb elemei a következők:
- <envelope> elem: az üzenet tartalmát fogja közre.
- <body> elem: az üzenetnek ezt kötelezően tartalmaznia kell, az üzenet magját hordozza.
- <header> elem: opcionálisan megadandó tag, mely az üzenet fejrészét tartalmazza.
Web szerviz elkészítése
A mellékelt példában elkészítünk egy Web szervizt, melynek metódusát a SOAP fejlécben megadott információk ellenőrzése után hívjuk meg egy kliens-alkalmazásból. A kérés egy SOAP üzenetben jut el a szervizig, azonban az üzenetet nem mi magunk állítjuk össze, csupán létrehozzuk az azt megvalósító osztályt.
A megoldás lényege, hogy a Web szerviz alkalmazás kódjában létrehozunk egy SOAP fejléc (SoapHeader) osztályból származó osztályt, majd a kliens-alkalmazásban az ebből példányosított objektumnak állítjuk be a megfelelő értékekkel a property-jeit, majd ezt küldjük el a szerviznek.
A kliensben akkor hívhatjuk meg a szervizünk metódusát, ha a szerviz a megfelelő adatokat találja a fejlécben. Ellenkező esetben hibaüzenet keletkezik, a feldolgozást pedig megtagadja.
A .NET Framework ehhez kapcsolódó szolgáltatásainak eléréséhez meg kell adnunk referenciaként a System.Web.Services névteret. Ehhez válasszuk a Project - Add reference menüpontot, majd a megjelenő ablakban a .NET lapon keressük elő a System.Web.Services elemet.
A forráskódot tartalmazó állományok elején meg kell adnunk, hogy a névtér osztályai közül melyekre van szükségünk.
using System.Web.Services;
using System.Web.Services.Protocols;
A SOAP fejléchez létrehozunk egy osztályt, mely a SoapHeader osztály gyermeke:
public class SHeader : SoapHeader
{
...
public string UserName;
public string Password;
public string EmpID;
}
Az osztály három nyilvános tagváltozóval rendelkezik. A UserName és Password tagok az azonosításhoz szükséges felhasználónevet (user) és jelszót (pwd) tartalmazzák majd, az EmpID tag pedig az adathalmazból visszaadandó rekord azonosítóját.
A szerviz osztályában kell egy objektumot létrehoznunk a fejléc osztályából:
public SHeader headerObject;
A kliens kérése egy SOAP üzenet lesz, mely a csatornán a következő szerkezettel mozog:
<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
A fejléc a három tagváltozóval:
<soap:Header>
<SHeader xmlns="http://www.softwareonline.hu/">
<UserName>string</UserName>
<Password>string</Password>
<EmpID>string</EmpID>
</SHeader>
</soap:Header>
A mag a meghívandó metódus nevével:
<soap:Body>
<GetDatas xmlns="http://www.softwareonline.hu/" />
</soap:Body>
</soap:Envelope>
A metódust nem is tudjuk meghívni a böngészőből, mert a fejlécet nem tudjuk feltölteni.
A meghívandó szerviz-metódust a következő attribútummal kell deklarálni annak érdekében, hogy a fejlécet azonosíthassa:
[WebMethod(),SoapHeader("headerObject")]
public string[] GetDatas()
{
A metódus visszatérési értéke egy karakterlánc-tömb, mely az adott rekord mezőit tartalmazza. Az adatokat a szerviz mappájában található Employees.xml állományból olvassa ki a szerviz. A művelet csak a fejléc ellenőrzése után kerül végrehajtásra:
if (headerObject.UserName == "user" && headerObject.Password == "pwd" && headerObject.EmpID != "")
{
...
}
...
És csak a megfelelő azonosító esetén kezdjük feltölteni a tömböt:
if (empid != -1)
{
pList = new string[ds.Tables[0].Columns.Count];
for(int i=0;i<ds.Tables[0].Columns.Count;i++)
{
pList[i] = ds.Tables[0].Rows[empid][i].ToString();
}
}
return pList;
}
A tömb értéke NULL lesz, ha nem a megfelelő értékekkel hívjuk meg a metódust.
Kliens-alkalmazás elkészítése
A metódusok eléréséhez szükségünk lesz egy proxy osztályra, melynek elkészítéséhez a Visual Studio.NET WSDL.EXE segédprogramját fogjuk felhasználni. A segédprogramnak paraméterként megadjuk a generálandó állomány nevét, valamint azt a címet, ahol a szerviz megtalálható:
wsdl /out: C:\Service.cs http://localhost/SoapHeaderUsage/Service1.asmx
Az elkészült proxy-osztály rendelkezésre áll, már csak fel kel használni az alkalmazásunkból. Csatolnunk kell projektünkhöz. A proxy felhasználásához el kell érnünk a SOAP protokoll kezeléséhez szükséges névteret, így a forrás fejlécében adjuk meg a következő sort:
using System.Web.Services.Protocols;
A művelet a LETÖLT gombbal indítható a szerkesztőmezők feltöltése után. Először példányosítjuk a proxy osztályt:
Service1 s = new Service1();
Létrehozunk egy példányt a fejléc osztályából is:
SHeader header = new SHeader();
Megadjuk a fejléc tagváltozóinak értékeként a mezők értékeit:
header.EmpID = textBox1.Text;
header.UserName = textBox2.Text;
header.Password = textBox3.Text;
Majd a proxy újdonsült változójának, mely a fejlécet takarja, megadjuk a feltöltött objektumot:
A metódust most már meghívhatjuk. Ellenkező esetben a hibaüzenet jelzi, hogy a fejléc objektum nem rendelkezik a várt adatokkal.
string[] pList = s.GetDatas();
Az eredményt a Form ListBox kontroljában listázzuk ki. A kliens-alkalmazás kérésére a következő válasz érkezik XML formátumban:
<soap:Envelope ...>
...
<soap:Body>
<GetDatasResponse xmlns="http://www.softwareonline.hu/">
<GetDatasResult>
<string>string</string>
<string>string</string>
</GetDatasResult>
</GetDatasResponse>
</soap:Body>
</soap:Envelope>