C# - Szerver alkalmazás konfigurációs állományának elkészítése

Remoting konfiguráció állományokkal 1. rész

forráskód letöltése
A .NET Remoting szolgáltatásának témakörében induló kétrészes cikksorozatunkban bemutatjuk az alkalmazások konfigurálásának lehetőségét, melynek segítségével programjaink csatornafoglalási adatait, illetve objektumhívási információit nem kell beégetnünk a kódba. Helyette készíthetünk egy konfigurációs állományt, melyben ezek a beállítások elhelyezhetők. Ma a szerver alkalmazás konfigurációs állományát készítjük el.
A program használatakor ügyelnie kell arra, hogy az alkalmazások helyes sorrendben legyenek elindítva. Elsőként a RServer alkalmazást kell elindítani.
A csatornahasználattal, és objektumhívással kapcsolatos információk tehát egy fájlban is elhelyezhetők. A fájl neve megegyezik a konfigurálandó alkalmazás teljes (kiterjesztéssel értendő) nevével, kiterjesztése pedig .CONFIG. Például a szerver-alkalmazásunk (RServer.exe) konfigurációs állománya a RServer.exe.config nevet viseli.
Az állomány szerkezete jól illeszkedik az XML-szabványhoz, meghatározott szabályok szerint elhelyezzük benne az információt, és az alkalmazásban meghívjuk a beolvasáshoz a megfelelő metódust. Igazán rugalmas, és skálázható alkalmazások fejleszthetők ezzel a módszerrel.
Amennyiben a remoting kommunikációban résztvevő alkalmazások valamelyike Web-alkalmazás, akkor a konfigurációs bejegyzések elhelyezhetők a Web.config állományban is.
A konfigurációs beállítások alkalmazásonként, sőt az aktivált objektumok típusától függően változnak. A példában egy klasszikus összeadást valósítunk meg úgy, hogy a szerver-aktiválta SINGLECALL objektum AddMethod metódusát hívjuk meg a kliens-alkalmazásból. A kliensben egyelőre maradunk a hagyományos, nem állományban konfigurált változatnál, szerverünk esetén helyezzük el a bejegyzéseket a fájlban.
A példa mappájában három projektet helyeztünk el. Ezek mindegyikében el kell végeznünk a következőket:
A .NET Framework Remoting szolgáltatásának, osztályainak eléréséhez meg kell adnunk referenciaként a System.Runtime.Remoting névteret. Ehhez válasszuk a Project - Add reference menüpontot, majd a megjelenő ablakban a .NET lapon keressük elő a System.Runtime.Remoting 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.
RObject projekt
A távoli objektum kódja, mely tartalmazza a metódus definícióját:
public String AddMethod(int a, int b) 
{
  return a.ToString() + " + " + b.ToString() + " = " + (a+b).ToString();
}
Az RObject objektum eléréséhez referenciaként mind a kliens-, mind a szerver-alkalmazásokhoz hozzá kell adnunk a RObject elemet. Ehhez válasszuk a Project - Add reference menüpontot, majd a megjelenő ablakban a Projects lapon jelöljük ki az RObject elemet.
RClient projekt
A kliens feladatát két részre osztottuk. Elsőként létrehozunk egy kapcsolatot a szerverrel, vagyis megpróbáljuk elérni az adott port-on figyelő alkalmazást.
Ehhez a TcpChannel osztályra lesz szükségünk, valamint az Activator osztály GetObject függvényére. Ez utóbbi képes arra, hogy egy adott távoli objektumot aktiváljon és arról egy referenciát visszaadjon. Első paraméterként az elérendő objektum típusát kell megadnunk itt is Type típusban. Második paraméterben egy kapcsolódási URL-t adunk meg, melyben a TCP protokollon keresztül elérjük az adott gépen futó, általunk választott port-on figyelő alkalmazást. A kapcsolódási sztring végén megadtuk a szerver alkalmazás konfigurációs állományának objectUri attribútumában feltüntetett RServer karakterláncot.
TcpChannel tc = new TcpChannel();
ChannelServices.RegisterChannel(tc);
rc = (RemoteObject)Activator.GetObject(typeof(RObject.RemoteObject), "tcp://localhost:9999/RServer");
A kapcsolatfelvétel után már nincs más teendőnk, mint a kapott objektum AddMethod függvényét a megfelelő paraméterezéssel meghívnunk. A forráskódon jól megfigyelhető, hogy e távoli függvény hívása pont úgy történik, mintha az egy a saját alkalmazásban lévő objektum egy függvénye lenne. Fenti előkészítő munkálatokat figyelmen kívül hagyva, valóban nincs is más teendőnk egy távoli függvény hívásakor, mint egy helyi függvény esetében.
try
{
  textBox3.Text = rc.AddMethod(Convert.ToInt32(textBox1.Text), Convert.ToInt32(textBox2.Text));
}
catch(SocketException ex)
{
  ...
}
RServer projekt
A szerver-alkalmazásban tevékenységet nem végzünk, csupán konfigurációs beállításait olvassuk be az XML állományból. Az állomány két jellemző tag közt hordozza a lényeget. Ezekkel kell jelezni a feldolgozó számára, hogy milyen beállításokat tartalmaz az állomány:
<configuration>
  <system.runtime.remoting>
    ...
  </system.runtime.remoting>
</configuration>
A fenti tagok közt találjuk az <application> elemet, melynek négy tagja van, ebből mi a <service> és a <channels> elemeket fogjuk használni.
A <service> elemben adható meg, hogy milyen objektumot fogunk meghívni, illetve aktiválni. Lehetséges elemei <wellknown>, melynek segítségével a szerver aktiválta objektumok jellemzői specifikálhatók, és az <activated> elem, mellyel a kliens aktiválta objektumok adhatók meg. Attribútumaik:
Elem Attribútum Magyarázat
<wellknown> displayName A .NET Framework Cnfiguration Tool eszközében használt név.
- mode Értékei SingleCall, és Singleton.
- type Meg kell adni a hívott objektum osztályának nevét, valamint az Assembly nevét egy string-ben.
- objectUri A végponti objektum URL-je (neve).
<activated> type Meg kell adni a hívott objektum osztályának nevét, valamint az Assembly nevét egy string-ben.
A <channels> befogadó elemnek egy eleme van, ez pedig a <channel> tag. Attribútumai:
<channel> ref Referencia egy létező csatornatípusra.
- port A használni kívánt port száma.
A szerver-alkalmazás konfigurációs állománya tehát a következőképpen fest:
<configuration>
  <system.runtime.remoting>
    <application>
A szerver aktiválta objektum jellemzői:
      <service>
       <wellknown mode="SingleCall" 
    type="RObject.RemoteObject,RObject" 
    objectUri="RServer" />
      </service>
A csatornajellemzők:
      <channels>
       <channel ref="tcp" port="9999" />
      </channels>
    </application>
  </system.runtime.remoting>
</configuration>
Az alkalmazás elindulása után meg kell hívni a metódust, mely beolvassa a beállításokat:
System.Runtime.Remoting.RemotingConfiguration.Configure("RServer.exe.config");

Remoting konfiguráció állományokkal cikksorozat

Szerver alkalmazás konfigurációs állományának elkészítése - Remoting konfiguráció állományokkal 1. rész

Kliens alkalmazás konfigurációs állományának elkészítése - Remoting konfiguráció állományokkal 2. rész