Sdílet prostřednictvím


Zlepšení výkonu ukládáním výstupů do mezipaměti (VB)

od Microsoftu

V tomto kurzu se dozvíte, jak můžete výrazně zlepšit výkon webových aplikací ASP.NET MVC tím, že využijete ukládání výstupu do mezipaměti. Dozvíte se, jak uložit výsledek vrácený z akce kontroleru, aby se nemusel vytvářet stejný obsah pokaždé, když akci vyvolá nový uživatel.

Cílem tohoto kurzu je vysvětlit, jak můžete výrazně zlepšit výkon aplikace ASP.NET MVC tím, že využijete výstupní mezipaměť. Výstupní mezipaměť umožňuje ukládat obsah vrácený akcí kontroleru do mezipaměti. Díky tomu se nemusí generovat stejný obsah při každém vyvolání stejné akce kontroleru.

Představte si například, že aplikace ASP.NET MVC zobrazí seznam databázových záznamů v zobrazení s názvem Index. Za normálních okolností se při každém vyvolání akce kontroleru, která vrací zobrazení indexu, musí být sada databázových záznamů načtena z databáze spuštěním databázového dotazu.

Pokud naopak využijete výstupní mezipaměť, můžete se vyhnout spuštění databázového dotazu pokaždé, když uživatel vyvolá stejnou akci kontroleru. Zobrazení je možné načíst z mezipaměti místo opětovného vygenerování z akce kontroleru. Ukládání do mezipaměti umožňuje vyhnout se provádění redundantní práce na serveru.

Povolení ukládání výstupu do mezipaměti

Ukládání výstupu do mezipaměti povolíte přidáním atributu <OutputCache> do akce jednotlivého kontroleru nebo celé třídy kontroleru. Například kontroler v seznamu 1 zveřejňuje akci s názvem Index(). Výstup akce Index() se ukládá do mezipaměti po dobu 10 sekund.

Výpis 1 – Controllers\HomeController.vb

<HandleError()> _
Public Class HomeController
    Inherits System.Web.Mvc.Controller

    <OutputCache(Duration:=10, VaryByParam:="none")> _
    Function Index()
        Return View()
    End Function

End Class

V beta verzích ASP.NET MVC nefunguje ukládání výstupu do mezipaměti pro adresu URL, jako je http://www.MySite.com/. Místo toho musíte zadat adresu URL, například .http://www.MySite.com/Home/Index

Ve výpisu 1 se výstup akce Index() ukládá do mezipaměti po dobu 10 sekund. Pokud chcete, můžete zadat mnohem delší dobu trvání mezipaměti. Pokud například chcete uložit výstup akce kontroleru do mezipaměti jeden den, můžete určit dobu trvání mezipaměti 86400 sekund (60 sekund × 60 minut × 24 hodin).

Neexistuje žádná záruka, že se obsah bude ukládat do mezipaměti po dobu, kterou zadáte. Když dojde k nedostatku prostředků paměti, mezipaměť začne automaticky vyřadit obsah.

Domovský kontroler ve výpisu 1 vrátí zobrazení indexu ve výpisu 2. Na tomto zobrazení není nic zvláštního. Zobrazení Index jednoduše zobrazuje aktuální čas (viz obrázek 1).

Výpis 2 – Views\Home\Index.aspx

<%@ Page Language="VB" Inherits="System.Web.Mvc.ViewPage" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
    <title></title>
</head>
<body>
    <div>
    
    The current time is: <%= DateTime.Now.ToString("T") %>
    
    </div>
</body>
</html>

Obrázek 1 – zobrazení indexu v mezipaměti

clip_image002

Pokud akci Index() vyvoláte několikrát zadáním adresy URL /Home/Index do adresního řádku prohlížeče a opakovaným stisknutím tlačítka Aktualizovat/Znovu načíst v prohlížeči, pak se čas zobrazený v zobrazení Index po dobu 10 sekund nezmění. Zobrazí se stejná doba, protože zobrazení je uložené v mezipaměti.

Je důležité si uvědomit, že pro každého, kdo navštíví vaši aplikaci, se ukládá stejné zobrazení do mezipaměti. Každý, kdo vyvolá akci Index(), získá stejnou verzi zobrazení Index v mezipaměti. To znamená, že množství práce, kterou webový server musí provést, aby mohl obsluhovat zobrazení indexu, se výrazně sníží.

Zobrazení v výpisu 2 se stane, že dělá něco opravdu jednoduchého. V zobrazení se zobrazí jenom aktuální čas. Stejně tak ale můžete snadno uložit do mezipaměti zobrazení, které zobrazuje sadu databázových záznamů. V takovém případě by se sada databázových záznamů nemusela načítat z databáze pokaždé, když je vyvolána akce kontroleru, která vrací zobrazení. Ukládání do mezipaměti může snížit množství práce, kterou musí váš webový i databázový server provést.

Nepoužívejte direktivu %@ OutputCache %> stránky <v zobrazení MVC. Tato direktiva krvácí z Web Forms světa a neměla by se používat v aplikaci ASP.NET MVC.

Kde se obsah ukládá do mezipaměti

Ve výchozím nastavení se při použití atributu <OutputCache> obsah ukládá do mezipaměti ve třech umístěních: na webovém serveru, na všech proxy serverech a ve webovém prohlížeči. Můžete určit, kde přesně se obsah ukládá do mezipaměti úpravou vlastnosti Location atributu <OutputCache> .

Vlastnost Location můžete nastavit na některou z následujících hodnot:

· Libovolný

· Klienta

· Následný

· Server

· Žádný

· ServerAndClient

Ve výchozím nastavení má vlastnost Location hodnotu Any. Existují však situace, kdy můžete chtít ukládat do mezipaměti pouze v prohlížeči nebo pouze na serveru. Pokud například ukládáte do mezipaměti informace přizpůsobené jednotlivým uživatelům, neměli byste je ukládat do mezipaměti na serveru. Pokud různým uživatelům zobrazujete různé informace, měli byste je ukládat do mezipaměti pouze v klientovi.

Například kontroler ve výpisu 3 zveřejňuje akci s názvem GetName(), která vrací aktuální uživatelské jméno. Pokud se Jack přihlásí k webu a vyvolá akci GetName(), vrátí tato akce řetězec "Hi Jack". Pokud se následně Jill přihlásí k webu a vyvolá akci GetName(), získá také řetězec "Hi Jack". Řetězec se na webovém serveru ukládá do mezipaměti pro všechny uživatele po počátečním vyvolání akce kontroleru.

Výpis 3 – Controllers\BadUserController.vb

Public Class BadUserController
    Inherits System.Web.Mvc.Controller

    <OutputCache(Duration:=3600, VaryByParam:="none")> _
    Function Index()
        Return "Hi " & User.Identity.Name
    End Function

End Class

S největší pravděpodobností kontroler v seznamu 3 nefunguje tak, jak chcete. Nechcete zobrazovat zprávu "Ahoj Jacku" Pro Jill.

V mezipaměti serveru byste nikdy neměli ukládat přizpůsobený obsah do mezipaměti. Můžete ale chtít uložit přizpůsobený obsah do mezipaměti prohlížeče, aby se zlepšil výkon. Pokud ukládáte obsah do mezipaměti v prohlížeči a uživatel vyvolá stejnou akci kontroleru vícekrát, můžete obsah načíst z mezipaměti prohlížeče místo ze serveru.

Upravený kontroler ve výpisu 4 ukládá výstup akce GetName() do mezipaměti. Obsah se však ukládá do mezipaměti pouze v prohlížeči, nikoli na serveru. Když pak metodu GetName() vyvolá více uživatelů, získá každý uživatel svoje vlastní uživatelské jméno, a ne uživatelské jméno jiné osoby.

Výpis 4 – Controllers\UserController.vb

Public Class UserController
    Inherits System.Web.Mvc.Controller

    <OutputCache(Duration:=3600, VaryByParam:="none", Location:=OutputCacheLocation.Client, NoStore:=True)> _
    Function GetName()
        Return "Hi " & User.Identity.Name
    End Function

End Class

Všimněte si, že <atribut OutputCache> ve výpisu 4 obsahuje vlastnost Location nastavenou na hodnotu OutputCacheLocation.Client. Atribut <OutputCache> obsahuje také vlastnost NoStore. Vlastnost NoStore se používá k informování proxy serverů a prohlížečů, že by neměly ukládat trvalé kopie obsahu uloženého v mezipaměti.

Změna výstupní mezipaměti

V některých situacích můžete chtít různé verze stejného obsahu uložené v mezipaměti. Představte si například, že vytváříte stránku předlohy nebo podrobností. Na stránce předlohy se zobrazí seznam názvů filmů. Když kliknete na název, zobrazí se podrobnosti o vybraném filmu.

Pokud uložíte stránku podrobností do mezipaměti, zobrazí se podrobnosti o stejném filmu bez ohledu na to, na který film kliknete. První film vybraný prvním uživatelem se zobrazí všem budoucím uživatelům.

Tento problém můžete vyřešit pomocí vlastnosti VaryByParam atributu <OutputCache> . Tato vlastnost umožňuje vytvořit různé verze stejného obsahu uložené v mezipaměti, pokud se liší parametr formuláře nebo parametr řetězce dotazu.

Například kontroler ve výpisu 5 zveřejňuje dvě akce s názvy Master() a Details(). Akce Master() vrátí seznam názvů filmů a akce Details() vrátí podrobnosti o vybraném filmu.

Výpis 5 – Controllers\MoviesController.vb

Public Class MoviesController
    Inherits System.Web.Mvc.Controller

    Private _dataContext As MovieDataContext

    Public Sub New()
        _dataContext = New MovieDataContext()
    End Sub

    <OutputCache(Duration:=Integer.MaxValue, VaryByParam:="none")> _
    Public Function Master()
        ViewData.Model = (From m In _dataContext.Movies _
                          Select m).ToList()
        Return View()
    End Function

    <OutputCache(Duration:=Integer.MaxValue, VaryByParam:="id")> _
    Public Function Details(ByVal id As Integer)
        ViewData.Model = _dataContext.Movies.SingleOrDefault(Function(m) m.Id = id)
        Return View()
    End Function

End Class

Akce Master() zahrnuje vlastnost VaryByParam s hodnotou none. Při vyvolání akce Master() se vrátí stejná verze hlavního zobrazení v mezipaměti. Všechny parametry formuláře nebo řetězce dotazu se ignorují (viz obrázek 2).

Obrázek 2 – zobrazení /Movies/Master

clip_image004

Obrázek 3 – Zobrazení /Filmy/Podrobnosti

clip_image006

Akce Details() zahrnuje vlastnost VaryByParam s hodnotou Id. Pokud jsou do akce kontroleru předány různé hodnoty parametru ID, vygenerují se různé verze zobrazení Podrobnosti uložené v mezipaměti.

Je důležité si uvědomit, že použití vlastnosti VaryByParam vede k většímu ukládání do mezipaměti, a ne méně. Pro každou jinou verzi parametru ID se vytvoří jiná verze zobrazení podrobností uložená v mezipaměti.

Vlastnost VaryByParam můžete nastavit na následující hodnoty:

* = Vytvořte jinou verzi uloženou v mezipaměti, kdykoli se liší parametr formuláře nebo řetězce dotazu.

none = Nikdy nevytvovávejte různé verze uložené v mezipaměti

Seznam parametrů středníkem = Vytvořit různé verze uložené v mezipaměti vždy, když se některý z parametrů formuláře nebo řetězce dotazu v seznamu liší.

Vytvoření profilu mezipaměti

Jako alternativu ke konfiguraci vlastností výstupní mezipaměti úpravou vlastností atributu <OutputCache> můžete vytvořit profil mezipaměti v souboru webové konfigurace (web.config). Vytvoření profilu mezipaměti v konfiguračním souboru webu nabízí několik důležitých výhod.

Za prvé, když nakonfigurujete ukládání výstupu do mezipaměti v konfiguračním souboru webu, můžete řídit, jak akce kontroleru ukládají obsah do mezipaměti v jednom centrálním umístění. Můžete vytvořit jeden profil mezipaměti a použít ho na několik kontrolerů nebo akcí kontroleru.

Za druhé můžete upravit konfigurační soubor webu bez opětovného zkompilování aplikace. Pokud potřebujete zakázat ukládání do mezipaměti pro aplikaci, která už byla nasazena do produkčního prostředí, můžete jednoduše upravit profily mezipaměti definované v konfiguračním souboru webu. Všechny změny v konfiguračním souboru webu budou rozpoznány automaticky a použity.

Například <oddíl konfigurace webu ukládání do mezipaměti> v seznamu 6 definuje profil mezipaměti s názvem Cache1Hour. Oddíl <ukládání do mezipaměti> se musí zobrazit v oddílu <system.web> webového konfiguračního souboru.

Výpis 6 – Oddíl ukládání do mezipaměti pro web.config

<caching>
<outputCacheSettings>
    <outputCacheProfiles>
        <add name="Cache1Hour" duration="3600" varyByParam="none"/>
    </outputCacheProfiles>
</outputCacheSettings>
</caching>

Kontroler v seznamu 7 ukazuje, jak můžete použít profil Cache1Hour na akci kontroleru s atributem <OutputCache> .

Výpis 7 – Controllers\ProfileController.vb

Public Class ProfileController
    Inherits System.Web.Mvc.Controller

    <OutputCache(CacheProfile:="Cache1Hour")> _
    Function Index()
        Return DateTime.Now.ToString("T")
    End Function

End Class

Pokud vyvoláte akci Index() vystavenou kontrolerem ve výpisu 7, vrátí se stejná doba po dobu 1 hodiny.

Souhrn

Ukládání výstupu do mezipaměti poskytuje velmi snadnou metodu výrazného zlepšení výkonu aplikací ASP.NET MVC. V tomto kurzu jste zjistili, jak pomocí atributu <OutputCache> uložit výstup akcí kontroleru do mezipaměti. Také jste se dozvěděli, jak upravit vlastnosti atributu <OutputCache> , jako jsou vlastnosti Duration a VaryByParam, abyste upravili způsob ukládání obsahu do mezipaměti. Nakonec jste se dozvěděli, jak definovat profily mezipaměti v konfiguračním souboru webu.