C# - SOAP kérések átirányítása, avagy a ReferralCache használata

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. Ezek közül az egyik lehetőség, hogy a szervizalkalmazásokat egy közvetítő – REFERRAL – szervizen keresztül érhetjük el. Ezzel kapcsolatban bemutatjuk, hogyan kell konfigurálni a közvetítő szervizalkalmazást.
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 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 assemblylistá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ó.
SService project létrehozása
A szervizalkalmazás – az egyszerűség kedvéért – egy metódussal rendelkezik, melynek neve GetLowerString. A metódus a paraméterként kapott string-et csupa kisbetűs formában adja vissza.
[WebMethod]
public string GetLowerString(string str)
{
  return str.ToLower();
}
A szervizalkalmazás Web.config állományában el kell helyezni a Microsoft.Web.Service névterének használatát lehetővé tevő bejegyzést, mely a következő:
<webServices>
  <soapExtensionTypes>
    <add type="Microsoft.Web.Services.WebServicesExtension, Microsoft.Web.Services, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" priority="1" group="0"/>
  </soapExtensionTypes>
</webServices>
RService projekt elkészítése
A RService szervizalkalmazás a közvetítő a valódi szerviz- és a kliensalkalmazás között. Ennek megfelelően csak konfigurációs állományokat tartalmaz, semmi mást. A Web.config állomány tartalmazza a HttpHandler kezelőre vonatkozó bejegyzést, mely megmutatja, hogy milyen típusú (kiterjesztésű) állományokra érkezik a SOAP kérés.
<httpHandlers>
  <add verb="*" path="*.asmx" type="Microsoft.Web.Services.Routing.RoutingHandler, Microsoft.Web.Services, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
</httpHandlers>
A <referral> tagban pedig elhelyezzük annak a konfigurációs állománynak a nevét, mely tartalmazza a hivatkozott linket, vagyis a SService szervizalkalmazás URL-jét. A konfigurációs állomány neve referralCache.config.
<microsoft.web.services>
  ...
  <referral>
    <cache name="referralCache.config" />
  </referral>
</microsoft.web.services>
A referralCache.config állományban, az <r:for> tagban megtalálható az a cím, melyre a kliensből hivatkozni kell:
<r:referrals xmlns:r="http://schemas.xmlsoap.org/ws/2001/10/referral">
  <r:ref>
    <r:for>      <r:exact>http://localhost/RService/Service.asmx</r:exact>
    </r:for>
    <r:if />
Az <r:go> tag pedig tartalmazza a helyes címet. Így elrejthető a valós URL.
    <r:go>      <r:via>http://localhost/SService/Service.asmx</r:via>
    </r:go>
    ...
  </r:ref>
</r:referrals>
Kliensalkalmazás elkészítése
A kliensalkalmazásban már csak a közvetítő szervizre hivatkozunk, a proxy osztályt is erre a „nem-létező” URL-re hozzuk létre. Nem működik a webes referencia hozzáadás, mert a hivatkozott URL, jelen esetben a http://localhost/RService/Service.asmx, nem egy valós cím.
Helyette manuálisan kell létrehozni egy proxy osztályt, és ott megadni a fenti URL-t, mint elérendő linket. Ezt legkönnyebben úgy tehetjük meg, hogy a valós linkre készítünk egy proxy-t, és a linket átírjuk a megcélzandóra.
...
public ServiceProxy() 
{
  this.Url = "http://localhost/RService/Service.asmx";
}
A RService projektben eszközölt átirányítás következtében a nem-valós linkre való hivatkozás is elérhetővé teszi a létező, a webes metódussal rendelkező szervizt.
Elsőként példányosítjuk a proxy-t, majd meghívjuk a metódust a szövegmezőben megadott szöveget átadva paraméterként.
ServiceProxy proxy = new ServiceProxy();
textBox2.Text = proxy.GetLowerString(textBox1.Text);
Látható tehát, hogy az átirányítás anélkül is megtörténhet, hogy a Web-szerveren bárminemű módosítást kellett volna végrehajtani.