C# - SOAP transzport a WSE 2.0 osztályaival

forráskód letöltése
A .NET Framework System.Web.Services névterének osztályait és lehetőségeit kiegészítendő a Microsoft elérhetővé tett egy névteret Web Services Enhancements for Microsoft® .NET (WSE) néven. Az 1.0-ás verzió után most megjelent a WSE 2.0 verziója, mely számos újdonsággal bővült. Cikkünkben bemutatjuk, hogyan használhatóak fel a csomag SoapService és SoapClient osztályai annak érdekében, hogy SOAP üzeneteket küldhessünk egy kliensalkalmazásból a szerviznek.
Mellékelt példa megnyitása előtt szükséges egy Service nevű virtuális könyvtár létrehozása, mely a példa könyvtárában található Service 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 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ó.
Szerviz létrehozása
A szervizalkalmazás ősosztálya különbözik az eddig megszokottaktól. Ennek oka az, hogy a kliensprogramból proxy osztály nélkül lehessen SOAP üzeneteket küldeni a szerviznek, és fogadni onnan. Így a szerviz osztálya a SoapService, míg a kliensalkalmazás üzenetküldő osztálya a SoapClient osztályból származik.
A szervizalkalmazás hivatkozásai közé fel kell vennünk a következő sorokat:
using Microsoft.Web.Services;
using Microsoft.Web.Services.Messaging;
A szerviz osztályának deklarációja – a SoapService osztályból származtatva azt – a következő:
public class ServiceClass : SoapService
{
  ...
A metódus – mely meghívható a kliensből – neve Greeting. A metódust a SoapMethodAttribute osztály segítségével minősítjük, jelezve, hogy a metódus az Interneten keresztül hívható.
[SoapMethod("")]
public string Greeting(string name)
{
  string greeting = "Üdvözlöm, kedves " + name;
  return greeting;
}
A metódus kap egy nevet karakterlánc formájában, majd visszaküld a kliensnek egy üdvözlőszöveget.
A szerviz Web.config állományában definiálni kell egy HttpHandler kezelőt, mely a HTTP csatornán érkező kéréseket dolgozza fel. Ez a szerviz osztálya lesz. A PATH attribútum egy tetszőleges, a kliensben hivatkozott erőforrás neve kell, hogy legyen. A TYPE attribútum az osztály típusát tartalmazza a névtér nevét is feltüntetve.
<httpHandlers>
  <add verb="*" path="ServiceClass.ashx" type="Service.ServiceClass,Service" />
</httpHandlers>
Kliensalkalmazás létrehozása
A kliens kódjában a következő hivatkozásokat kell elhelyezni a SoapClient osztály elérése érdekében:
using Microsoft.Web.Services.Addressing;
using Microsoft.Web.Services.Messaging;
A kliensben létrehozunk egy SClient nevű osztályt, melynek őse a SoapClient absztrakt osztály.
Az osztály konstruktorában paraméterként megadjuk azt a címet (URL-t), melyen a szervizalkalmazás elérhető.
public SClient( Uri to ) : base( to ){}
A kliensben a szervizalkalmazás Greeting metódusának meghívását elősegítendő létrehozunk egy függvényt, mely szignatúrájában megegyezik a szerviz metódusával. Itt azonban nem a konkrét kódot adjuk meg, hanem elküldjük a SOAP borítékba csomagolt kérést a szerviznek. A kérés tartalmazza a kliensben megadott nevet, mint metódusparamétert.
[SoapMethod("")]
public string Greeting(string name)
{
  return (string)base.SendRequestResponse("Greeting",name).GetBodyObject(typeof(System.String));
}
Erre az ősosztály SendRequestResponse metódusát használjuk, melynek első paramétere a hívandó metódus neve, második paramétere a küldendő metódusparaméter. A GetBodyObject metódussal megadjuk, hogy a paraméter milyen típusú. Itt több paraméter esetén egy tömböt kellene megadnunk.
A nyomógomb megnyomásakor egyszerűen példányosítjuk a SClient osztályt, egy URL-t átadva paraméterként. Az URL a következő lenne abban az esetben, ha a szervizt futtató számítógép neve MACHINE:
http://machine/Service/ServiceClass.ashx"
A SClient konstruálása tehát a következőképpen fest:
SClient proxy = new SClient(new Uri("http://" + System.Net.Dns.GetHostName() + "/Service/ServiceClass.ashx") );
A művelet végén meghívjuk a Greeting metódust.
textBox1.Text = proxy.Greeting(textBox2.Text);