Navigace

Hlavní menu

 

Submenu

 

WWW, WAP a PDA stránky na jedné adrese v ASP.NET

S pomocí rozšíření .net Frameworku pro mobilní zařízení můžeme na několika řádcích vytvořit spolehlivý redirektor, který uživatele přesměruje vždy na nejvhodnější verzi stránek pro jeho zařízení. Na rozdíl od podobné funkce v PHP, o které jsme již psali, za nás celý mechanismus detekce typu a schopností zařízení totiž provede .net Framwork sám.

Je potřeba si říct, že vůbec nejde o jediný způsob, jak nabízet jednu aplikaci pro vícero zařízení. Další možností může být rozšíření System.Web.UI.MobileControls.MobilePage. Základní aplikace je pak vždy funkční všude i přes určitý "spartánský vzhled" - viz předchozí článek. Řešením je zařazení tzv. DeviceSpecific šablon, takže lze pohodlně vytvořit aplikaci, která se velmi flexibilně přizpůsobuje možnostem zařízení.

Předem můžeme rovnou říct, že princip zde popisované aplikace je analogický popisované aplikaci využívající PHP. Zjistíme typ a schopnosti zařízení a podle toho nastavíme URL pro následné přesměrování, čímž úloha celé aplikace končí. Systém .net Framework má velmi komplexní rozšíření pro mobilní zařízení v prostoru názvů System.Web.Mobile, dovede rozpoznat velké množství zařízení, a tak se kód aplikace scvrkne jen na zavedení potřebného prostorů názvů, získání údajů o schopnostech zařízení a rozhodovací část switch.

Vycházíme z předpokladu, že výchozí stránka Default.aspx, která zajišťuje detekci a přesměrování, bude v kořeni serveru a na základě detekce přesměruje uživatele do jiného adresáře nebo na jinou stránku. Kód aplikace je opravdu triviální, proto si jej rovnou popíšeme (zdrojový kód ukázek):

<%@ Page Language="C#" EnableViewState="False" EnableSessionState="False" %>
<%@ Import Namespace="System.Web.Mobile" %>
<script RunAt="server">
void Page_Load (Object sender, EventArgs e)
{
  MobileCapabilities currentCapabilities = (MobileCapabilities) Request.Browser;
  String pageUrl = "http://server.cz/cms/";
  if (currentCapabilities.IsMobileDevice)
  {
    switch (currentCapabilities.PreferredRenderingType)
    {
      case "html32":
        if ((currentCapabilities.ScreenCharactersWidth < 20) || (currentCapabilities.Browser.ToLower() == "pocket pc") || (currentCapabilities.MobileDeviceModel.ToLower() == "pocket pc"))
          pageUrl = "http://server.cz/mda/";
      break;
      case "chtml10":
        pageUrl = "http://server.cz/mda/";
      break;
      case "wml12":
        pageUrl = "http://wap.server.cz/";
      break;
      case "wml11":
        pageUrl = "http://wap.server.cz/";
      break;
      default:
      break;
    }
  }
  Response.Buffer= true;
  Response.ClearContent();
  Response.Redirect(pageUrl,true);
}
</script>

V direktivách stránky (Page) vidíme "povypínané" funkce pro udržování stavových informací, které jsou pro naši aplikaci zbytečné a jen by ubíraly systémové prostředky serveru. Je zaveden potřebný prostor názvů System.Web.Mobile.

Výkonná část sestává z obsluhy události Page_Load, která nastane při zavádění stránky na serveru. Zde si uložíme získané schopnosti zařízení (MobileCapabilities) z vlastnosti Request.Browser. Dále si nastavíme proměnnou udávající řetězec URL, kam se bude přesměrovávat - výchozí hodnotu nastavíme na adresu naší webové stránky, určené pro běžné prohlížeče osobních počítačů. Z vlastnosti IsMobileDevice určíme, zda se jedná o mobilní zařízení. Pokud ano, podle vlastnosti PreferredRenderingType rozhodneme, jaké schopnosti zařízení má.

Pokud zařízení tvrdí, že umí zobrazit HTML kód verze 3.2, ještě navíc ověříme, zda šířka displeje je větší než 20 znaků nebo zda nejde o zařízení typu Pocket PC. To zjistíme z vlastnosti Browser a u některých zařízení přímo jako rozpoznaný model z vlastnosti MobileDeviceModel. Pokud zařízení vyhoví těmto podmínkám, nastavíme URL na speciální verzi našich stránek vhodnou pro tato zařízení (např. počítač s mobilním telefonem typu MDA). Pokud podmínkám nevyhovuje, jde zřejmě o zařízení s dostatečně velkým displejem a proto adresu pro přesměrování měnit nebudeme - ponecháme výchozí a klient bude přesměrován na běžnou webovou verzi. Obdobně potom rozhodneme o přesměrování zařízení, která podporují tzv. compact HTML, WML verze 1.1 a verze 1.2. Zda budou adresy stejné nebo rozdílné záleží na tom, kolik verzí máme připravených.

Problémem mobilních zařízení je, že ne všechna podporují cookies a pokud by je aplikace na zařízení odeslala, může dojít k selhání zobrazení. Bohužel tedy musíme vypnout používání cookies pro session. Rovněž tak je potřeba, aby URL, kterou ASP.NET generuje v hlavičce pro přesměrování, byla skutečně absolutní, jak definuje norma RFC. Obojí zajistíme nastavením v souboru Web.config. Nastavení chování mechanismu session je globální (nelze nastavit pro location nebo v podřízeném adresáři), proto je lepší, když webová verze stránek bude umístěna v podadresáři, pro který je vytvořena zvlášť virtuální aplikace, abychom zde mohli sessions využívat se vším komfortem včetně cookies.

Potřebné nastavení v konfiguračním souboru Web.config:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <system.web> 
    <sessionState cookieless="true" />
    <httpRuntime useFullyQualifiedRedirectUrl="true" />
  </system.web>
</configuration>

Pro zlepšení přenositelnosti aplikace by se hodilo URL jednotlivých verzí přebírat z vlastních hodnot v souboru Web.config jako ve výše odkazovaném článku, v našem příkladu je URL uvedeno napevno přímo v kódu aplikace pouze z důvodu názornosti a přehlednosti.

Růžička, Pavel (18. 9. 2003)
odborný redaktor Interval.cz
Diskuze: WWW, WAP a PDA stránky na jedné adrese v ASP.NET