Zrychlujeme aplikace používající webové služby

5. dubna 2007

O autorovi

Portrét

Jan Aubrecht
.NET vývojář a konzultant IS/IT
honza@intellisoft.cz

Honza se zabývá vývojem webových aplikací od roku 2000. Rád používá ASP.NET 2.0 a je přímo posedlý neustálým zlepšováním svých aplikací.

Ve volném čase je jeho vášní dobré jídlo a pití. Nejraději se baví přípravou středomořských specialit a báječnými víny z Francie.

Další články

Pokud vyvíjíte aplikace používající webové služby, určitě víte, že úzkým hrdlem těchto aplikací bývá rychlost resp. pomalost výměny dat mezi webovou službou a klientskou aplikací. Tento článek se vám pokusí ukázat, jak je možné zrychlit komunikaci mezi službou a jejím klientem v prostředí .NET Framework 2.0.

Jak služby komunikují?

Pojďme se na úvod podívat, jak probíhá komunikace mezi webovou službou a jejím klientem.

Webové služby komunikují s okolním světem prostřednictvím protokolu HTTP. Je to tedy stejný protokol, který se používá pro výměnu dat mezi internetovým prohlížečem a webovým serverem. Webové služby jsou tedy hostovány na webovém serveru úplně stejně jako klasické HTML stránky, obrázky apod.

Data mezi službou a jejími klienty se přenášejí ve formátu XML. Z toho vyplývá, že každý požadavek na webovou službu je do tohoto formátu převeden a až po té je odeslán webové službě. Ta požadavek zpracuje, svoji odpověď opět převede do XML a výsledek odešle zpět klientovi.

Jaké jsou nevýhody?

Protože je formát XML poměrně upovídaný, tak se může stát, že komunikace mezi službou a klientem poměrně vázne kvůli množství přenesených dat.

Často tak dochází k tomu, že většinu času potřebného pro zpracování požadavku zabere právě přenos dat po síti. Aplikace tak často čekají, dokud si nevymění s webovou službou všechna data. Podobně čeká i uživatel, který většinou nemůže s aplikací dále pracovat.

Pojďme se podívat, jakým způsobem je možné komunikaci mezi serverem a klientem zrychlit.

Zrychlujeme komunikaci

Možná víte, že specifikace protokolu HTTP 1.1 umožňuje při komunikaci se serverem používat HTTP kompresi. Server všechna data před odesláním zkomprimuje a po té je odešle klientovi. Ten je pak dekomprimuje a použije úplně stejným způsobem, jako kdyby od serveru dostal nekomprimovaná data.

Protože si webové služby vyměňují data ve formátu XML, který je textový, může být úspora přenášených dat poměrně značná.

Pokud se chcete detailněji podívat, jaké množství dat lze ušetřit při přenosu webových stránek díky HTTP kompresi, můžete použít tuto on-line aplikaci.

Používáme HTTP kompresi

Pokud chceme využít všech výhod HTTP komprese, tak je nutné, aby ji podporoval jak webový server, tak i klient, který se serverem komunikuje.

Komunikace se serverem ve skutečnosti probíhá tak, že klient serveru sdělí, jaké typy komprese podporuje (pomocí HTTP hlavičky Accept-Encoding). Pokud server umí používat klientem podporované typy komprese, tak svoji odpověď zkomprimuje příslušným kompresním algoritmem a odešle odpověď klientovi. Zároveň mu pomocí hlavičky Content-Encoding sdělí, jaký kompresní algoritmus použil pro komprimaci odpovědi.

Pokud klient serveru nepředá, jaké kompresní algoritmy podporuje nebo pokud server neumí pracovat se žádným typem komprese, který mu klient nabídl, tak server svoji odpověď nijak nekomprimuje a odešle data klientovi běžným způsobem (tzn. bez použití komprese).

Z uvedeného popisu tedy vyplývá, že naše webová služba nebo webové stránky budou se zapnutou kompresí dostupné i klientům, kteří HTTP kompresi neumějí využít.

Nastavení na serveru

Příklady nastavení

Příklad nastavení HTTP komprese pro IIS 6.0 EN
Zvětšit

Příklad nastavení HTTP komprese pro IIS 6.0 CZ
Zvětšit

Pojďme se podívat, jak nastavit webový server, aby začal používat HTTP kompresi jak pro webové stránky, tak i pro webové služby.

Ukážeme si nastavení pro Internet Information Services (IIS) 6.0:

  1. Spustíme Internet Information Services Manager.
  2. Vybereme složku Websites, na kterou klikneme pravým tlačítkem myši.
  3. V zobrazeném kontextovém menu zvolíme položku Properties.
  4. Na záložce Service zaškrtneme položky Compress application files a Compress static files.
  5. Konfiguraci uložíme kliknutím na tlačítko OK.

Dále musíme nastavit, pro jaké typy souborů bude webový server HTTP kompresi používat.

Tuto možnost nastavení už bohužel IIS Manager neobsahuje, takže musíme sáhnout buď po přímé editaci IIS metabáze nebo můžeme použít skript adsutil.vbs. Ten se zpravidla nachází v adresáři C:\Inetpub\AdminScripts.

Typy souborů, které bude web server komprimovat, nastavíme následovně:

  • Statické soubory - css, htm, html, js, txt, vbs, xml
  • Dynamické aplikace - asmx, asp, aspx, dll, exe

Nastavení provedeme následujícími příkazy (pomocí skriptu adsutil.vbs):

cscript.exe adsutil.vbs SET W3SVC/Filters/Compression/DEFLATE/HcFileExtensions "css" "htm" "html" "js" "txt" "vbs" "xml"
cscript.exe adsutil.vbs SET W3SVC/Filters/Compression/GZIP/HcFileExtensions "css" "htm" "html" "js" "txt" "vbs" "xml"
cscript.exe adsutil.vbs SET W3SVC/Filters/Compression/DEFLATE/HcScriptFileExtensions "asmx" "asp" "aspx" "dll" "exe"
cscript.exe adsutil.vbs SET W3SVC/Filters/Compression/GZIP/HcScriptFileExtensions "asmx" "asp" "aspx" "dll" "exe"

Nyní můžeme restartovat IIS, aby se nastavení projevilo.

Nastavení u klienta

Když máme povolenu HTTP kompresi na serveru, na kterém je hostována naše webová služba, můžeme se pustit do úpravy klientské aplikace. Popis platí pro aplikaci, která běží v prostředí .NET Framework 2.0.

Asi vás překvapí, že jedinou úpravou, kterou je nutné v aplikaci udělat, je přidání jednoho řádku kódu. V tomto řádku zapneme používání HTTP komprese pomocí vlastnosti EnableDecompression, která je součástí třídy HttpWebClientProtocol.

Pak nám už nic nebrání zavolat příslušnou webovou metodu a vyzkoušet rychlejší komunikaci naší aplikace s webovou službou.

Jak vypadá výsledek?

Pro zajímavost přikládám výsledky měření rychlosti komunikace jednoduché webové služby a WinForms aplikace. Z výsledků je patrné, že výrazného zrychlení lze dosáhnout zejména u aplikací, které si se službou vyměňují větší množství dat.

Měření probíhalo na 3 Mbps lince, při kterém webová služba vracela různé množství záznamů uložených v DataSetu.

Výsledky měření

Zdrojové kódy příkladu, který byl použit pro měření, si můžete stáhnout zde.