3. Webové služby

[znalosti]

Webová služba umožňuje webové stránce rozšířit její funkcionalitu a dynamičnost díky možnosti programování. Webové služby mohou přijímat zprávy a na tyto zprávy odpovídat.

Dnes je možno přes internet provádět dotazy nad databázemi, objednat si letenku, zjistit stav naší zakázky apod.

Webové služby mohou být volány prostřednictvím POST nebo GET metod protokolu HTTP ve spojení s protokolem SOAP.

[znalosti]

SOAP (Simple Object Access Protocol) slouží pro vzdálené volání procedur. Jedná se o specifikaci vytvořenou skupinou společností, mezi které se řadí i Microsoft a DevelopMentor. SOAP je založen na všeobecně přijímaných internetových standardech jako je XML.

Webové služby se ukládají do souborů s příponou .asmx. Podmínkou pro správnou funkci webové služby je přítomnost ASP.NET na webovém serveru. Pokud prostředí ASP.NET zjistí požadavek na soubor s touto příponou, zprostředkuje volání handleru webové služby.

Tyto handlery jsou reprezentovány instancemi tříd implementujících rozhraní System.Web.IHTTPHandler. Rozhraní IHTTPHandler definuje dvě metody - IsReusable a ProcessRequest. IsReusable umožňuje zjistit instanci IHTTPHandleru, zda může být použita vícekrát. Metoda ProcessRequest má objekt HttpContext jako svůj parametr. Právě zde se začíná implementovat práce s HTTP.

Tyto handlery přijímají požadavky a vracejí odpovědi. Pokud se v HTTP prostředí zjistí přítomnost na požadavek souboru s příponou .aspx, zavolá se handler registrovaný pro soubory s touto příponou. V prostředí ASP.NET je tímto handlerem System.Web.UI.PageHandlerFactory. V případě .asmx je zavolán handler System.Web.Services.Protocols.WebServiceHandlerFactory.

Díky tomuto handleru je ASP.NET schopno s použitím reflexe vytvořit dynamicky HTML stránku. Stránka bude obsahovat možnosti a metody volané služby. Na této straně se rovněž objeví možnost otestovat metody této služby.

3.1. WSDL a SDL

[znalosti]

WSDL (Web Service Definition Language) je jazyk založený na XML sloužící pro popis možností webových služeb. Popisuje rozhraní služby, typy argumentů a návratových hodnot. Tento jazyk umožňuje zapsat webovou službu jako XML data a odeslat klientovi. Díky této možnosti lze tuto webovou službu přenést na lokální počítač.

3.2. Jednoduchá webová služba

Vytvoříme jednoduchou webovou službu, kterou uložíme jako GreetingService.asmx:

[ukázka kódu]
<%@ WebService Language="C#" class="GreetingService" %>
using System;
using System.Web.Services;
public class GreetingService {
  [WebMethod]
  public string Hello(string who) {
    return ("Hello, world!!! Special greetings for " + who);
  }
}

Pro označení metody jako použitelné pro webovou službu se nad tuto metodu přidává atribut WebMethod. Abychom mohli tuto metodu vyzkoušet na našem počítači, je zapotřebí mít nainstalovaný webový server podporující ASP.NET (IIS apod.). Tento soubor zkopírujeme do virtuálního adresáře serveru a zavoláme jej z prohlížeče, např.: http://localhost/sluzba/GreetingService.asmx.

Webové služby nejsou omezeny používáním pouze jednoduchých datových typů, mezi které patří řetězce a čísla. Lze používat i složitější typy, například struktury apod.

3.3. Způsob využití webové služby

Součástí Microsoft Visual Studia je konzolová aplikace WSDL (umístění v adresáři Microsoft Visual Studio .NET\Sdk\v1.1\Bin). Tato aplikace vytvoří zástupce webové služby tak, aby ji bylo možno používat lokálně. Předtím je třeba udělat následující kroky.

  • Nejprve zjistíme umístění webové služby.

    Například víme, že se služba nachází na adrese http://localhost/sluzba\GreetingTest.asmx.

  • Následně vytvoříme místního zástupce (proxy) pro vzdálenou službu. Tento zástupce umožní programátorovi s webovou službou pracovat, jako by se nacházela na lokálním počítači.

    wsdl "http://localhost/sluzba/GreetingService.asmx" /out:GreetingServiceProxy.cs

  • Vytvoříme knihovnu ze zástupce webové služby

    csc /out:bin\GreetingServiceProxy.dll /t:library /r:system.web.services.dll /r:system.xml.serialization.dll GreetingServiceProxy.cs

    vytvořili jsme GreetingServiceProxy.dll v adresáři Bin aktuálního adresáře

Následující aplikace používá službu GreetingService.

[ukázka kódu]
using System;
class MyClass {
  public static void Main(string[] args) {
    // vytvoreni instance objektu puvodne definovaneho v GreetingService.asmx
    // a pripojeneho diky WSDL kontraktu
    GreetingService gs = new GreetingService();
    // nasleduje bezna prace s instanci vzdaleneho objektu
    Console.WriteLine(gt.Hello("Jan"));
  }
}

Takto vytvořený kód uložíme do souboru GreetingTest.cs a budeme kompilovat následujícím způsobem (a s těmito knihovnami):

csc /r:system.web.services.dll /r:GreetingServiceProxy.dll GreetingTest.cs