Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
oleh Microsoft
Dalam tutorial ini, Anda mempelajari bagaimana Anda dapat secara dramatis meningkatkan performa aplikasi web ASP.NET MVC Anda dengan memanfaatkan penembolokan output. Anda mempelajari cara menyimpan cache hasil yang dikembalikan dari tindakan pengontrol sehingga konten yang sama tidak perlu dibuat setiap kali pengguna baru memanggil tindakan.
Tujuan dari tutorial ini adalah untuk menjelaskan bagaimana Anda dapat secara dramatis meningkatkan performa aplikasi MVC ASP.NET dengan memanfaatkan cache output. Cache output memungkinkan Anda untuk menyimpan cache konten yang dikembalikan oleh tindakan pengontrol. Dengan begitu, konten yang sama tidak perlu dihasilkan masing-masing dan setiap kali tindakan pengontrol yang sama dipanggil.
Bayangkan, misalnya, bahwa aplikasi MVC ASP.NET Anda menampilkan daftar rekaman database dalam tampilan bernama Indeks. Biasanya, setiap kali pengguna memanggil tindakan pengontrol yang mengembalikan tampilan Indeks, kumpulan rekaman database harus diambil dari database dengan menjalankan kueri database.
Jika, di sisi lain, Anda memanfaatkan cache output maka Anda dapat menghindari menjalankan kueri database setiap kali pengguna memanggil tindakan pengontrol yang sama. Tampilan dapat diambil dari cache alih-alih diregenerasi dari tindakan pengontrol. Penembolokan memungkinkan Anda menghindari pekerjaan redundan di server.
Mengaktifkan Penembolokan Output
Anda mengaktifkan penembolokan output dengan menambahkan atribut [OutputCache] ke tindakan pengontrol individual atau seluruh kelas pengontrol. Misalnya, pengontrol di Daftar 1 memaparkan tindakan bernama Index(). Output tindakan Index() di-cache selama 10 detik.
Daftar 1 – Controllers\HomeController.cs
using System.Web.Mvc;
namespace MvcApplication1.Controllers
{
[HandleError]
public class HomeController : Controller
{
[OutputCache(Duration=10, VaryByParam="none")]
public ActionResult Index()
{
return View();
}
}
}
Dalam versi Beta ASP.NET MVC, penembolokan output tidak berfungsi untuk URL seperti http://www.MySite.com/. Sebagai gantinya, Anda harus memasukkan URL seperti http://www.MySite.com/Home/Index.
Di Daftar 1, output tindakan Index() di-cache selama 10 detik. Jika mau, Anda dapat menentukan durasi cache yang lebih lama. Misalnya, jika Anda ingin menyimpan output tindakan pengontrol selama satu hari maka Anda dapat menentukan durasi cache 86400 detik (60 detik * 60 menit * 24 jam).
Tidak ada jaminan bahwa konten akan di-cache untuk jumlah waktu yang Anda tentukan. Ketika sumber daya memori menjadi rendah, cache mulai mengusir konten secara otomatis.
Pengontrol Beranda di Daftar 1 mengembalikan tampilan Indeks di Daftar 2. Tidak ada yang istimewa tentang pemandangan ini. Tampilan Indeks hanya menampilkan waktu saat ini (lihat Gambar 1).
Daftar 2 – Views\Home\Index.aspx
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Index.aspx.cs" Inherits="MvcApplication1.Views.Home.Index" %>
<!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>Index</title>
</head>
<body>
<div>
The current time is: <%= DateTime.Now.ToString("T") %>
</div>
</body>
</html>
Gambar 1 – Tampilan Indeks Singgahan
Jika Anda memanggil tindakan Index() beberapa kali dengan memasukkan URL /Home/Index di bilah alamat browser Anda dan menekan tombol Refresh/Muat Ulang di browser Anda berulang kali, waktu yang ditampilkan oleh tampilan Indeks tidak akan berubah selama 10 detik. Waktu yang sama ditampilkan karena tampilan di-cache.
Penting untuk dipahami bahwa tampilan yang sama di-cache untuk semua orang yang mengunjungi aplikasi Anda. Siapa pun yang memanggil tindakan Index() akan mendapatkan versi cache yang sama dari tampilan Indeks. Ini berarti bahwa jumlah pekerjaan yang harus dilakukan server web untuk melayani tampilan Indeks berkurang secara dramatis.
Tampilan di Listing 2 kebetulan melakukan sesuatu yang sangat sederhana. Tampilan hanya menampilkan waktu saat ini. Namun, Anda bisa dengan mudah menyimpan cache tampilan yang menampilkan sekumpulan rekaman database. Dalam hal ini, kumpulan rekaman database tidak perlu diambil dari database masing-masing dan setiap kali tindakan pengontrol yang mengembalikan tampilan dipanggil. Penembolokan dapat mengurangi jumlah pekerjaan yang harus dilakukan server web dan server database Anda.
Jangan gunakan halaman <%@ OutputCache %> direktif dalam tampilan MVC. Arahan ini berdarah dari dunia Formulir Web dan tidak boleh digunakan dalam aplikasi MVC ASP.NET.
Tempat Konten Di-cache
Secara default, saat Anda menggunakan atribut [OutputCache], konten di-cache di tiga lokasi: server web, server proksi apa pun, dan browser web. Anda dapat mengontrol dengan tepat di mana konten di-cache dengan memodifikasi properti Lokasi atribut [OutputCache].
Anda bisa mengatur properti Lokasi ke salah satu nilai berikut ini:
· Apa pun
· Klien
· Hilir
· Server
· Tidak
· ServerAndClient
Secara default, properti Lokasi memiliki nilai Apa pun. Namun, ada situasi di mana Anda mungkin ingin menyimpan cache hanya di browser atau hanya di server. Misalnya, jika Anda menyimpan cache informasi yang dipersonalisasi untuk setiap pengguna, Anda tidak boleh menyimpan informasi di server. Jika Anda menampilkan informasi yang berbeda kepada pengguna yang berbeda maka Anda harus menyimpan informasi hanya pada klien.
Misalnya, pengontrol di Listing 3 memaparkan tindakan bernama GetName() yang mengembalikan nama pengguna saat ini. Jika Jack masuk ke situs web dan memanggil tindakan GetName() maka tindakan mengembalikan string "Hi Jack". Jika, selanjutnya, Jill masuk ke situs web dan memanggil tindakan GetName() maka dia juga akan mendapatkan string "Hi Jack". String di-cache di server web untuk semua pengguna setelah Jack awalnya memanggil tindakan pengontrol.
Listing 3 – Controllers\BadUserController.cs
using System.Web.Mvc;
using System.Web.UI;
namespace MvcApplication1.Controllers
{
public class BadUserController : Controller
{
[OutputCache(Duration = 3600, VaryByParam = "none")]
public string GetName()
{
return "Hi " + User.Identity.Name;
}
}
}
Kemungkinan besar, pengontrol di Listing 3 tidak berfungsi seperti yang Anda inginkan. Anda tidak ingin menampilkan pesan "Hai Jack" ke Jill.
Anda tidak boleh menyimpan konten yang dipersonalisasi dalam cache server. Namun, Anda mungkin ingin menyimpan konten yang dipersonalisasi di cache browser untuk meningkatkan performa. Jika Anda menyimpan konten di browser, dan pengguna memanggil tindakan pengontrol yang sama beberapa kali, maka konten dapat diambil dari cache browser alih-alih server.
Pengontrol yang dimodifikasi di Listing 4 menyimpan output tindakan GetName(). Namun, konten hanya di-cache di browser dan bukan di server. Dengan begitu, ketika beberapa pengguna memanggil metode GetName(), setiap orang mendapatkan nama pengguna mereka sendiri dan bukan nama pengguna orang lain.
Daftar 4 – Controllers\UserController.cs
using System.Web.Mvc;
using System.Web.UI;
namespace MvcApplication1.Controllers
{
public class UserController : Controller
{
[OutputCache(Duration=3600, VaryByParam="none", Location=OutputCacheLocation.Client, NoStore=true)]
public string GetName()
{
return "Hi " + User.Identity.Name;
}
}
}
Perhatikan bahwa atribut [OutputCache] di Daftar 4 menyertakan properti Lokasi yang diatur ke nilai OutputCacheLocation.Client. Atribut [OutputCache] juga menyertakan properti NoStore. Properti NoStore digunakan untuk menginformasikan server proksi dan browser bahwa mereka tidak boleh menyimpan salinan permanen konten yang di-cache.
Memvariasikan Cache Output
Dalam beberapa situasi, Anda mungkin menginginkan versi cache yang berbeda dari konten yang sangat sama. Bayangkan, misalnya, bahwa Anda membuat halaman master/detail. Halaman master menampilkan daftar judul film. Ketika mengklik judul, Anda mendapatkan detail untuk film terpilih.
Jika Anda menyimpan cache halaman detail, maka detail untuk film yang sama akan ditampilkan terlepas dari film mana yang Anda klik. Film pertama yang dipilih oleh pengguna pertama akan ditampilkan kepada semua pengguna di masa mendatang.
Anda dapat memperbaiki masalah ini dengan memanfaatkan properti VaryByParam dari atribut [OutputCache]. Properti ini memungkinkan Anda membuat versi cache yang berbeda dari konten yang sama ketika parameter formulir atau parameter string kueri bervariasi.
Misalnya, pengontrol di Listing 5 memaparkan dua tindakan bernama Master() dan Details(). Tindakan Master() mengembalikan daftar judul film dan tindakan Details() mengembalikan detail untuk film yang dipilih.
Daftar 5 – Controllers\MoviesController.cs
using System.Linq;
using System.Web.Mvc;
using MvcApplication1.Models;
namespace MvcApplication1.Controllers
{
public class MoviesController : Controller
{
private MovieDataContext _dataContext;
public MoviesController()
{
_dataContext = new MovieDataContext();
}
[OutputCache(Duration=int.MaxValue, VaryByParam="none")]
public ActionResult Master()
{
ViewData.Model = (from m in _dataContext.Movies
select m).ToList();
return View();
}
[OutputCache(Duration = int.MaxValue, VaryByParam = "id")]
public ActionResult Details(int id)
{
ViewData.Model = _dataContext.Movies.SingleOrDefault(m => m.Id == id);
return View();
}
}
}
Tindakan Master() menyertakan properti VaryByParam dengan nilai "none". Saat tindakan Master() dipanggil, versi cache yang sama dari tampilan Master dikembalikan. Parameter formulir atau parameter string kueri apa pun diabaikan (lihat Gambar 2).
Gambar 2 – Tampilan /Movies/Master
Gambar 3 – Tampilan /Film/Detail
Tindakan Details() menyertakan properti VaryByParam dengan nilai "Id". Ketika nilai parameter Id yang berbeda diteruskan ke tindakan pengontrol, versi cache yang berbeda dari tampilan Detail dihasilkan.
Penting untuk dipahami bahwa menggunakan properti VaryByParam menghasilkan lebih banyak penembolokan dan tidak kurang. Versi cache yang berbeda dari tampilan Detail dibuat untuk setiap versi parameter Id yang berbeda.
Anda bisa mengatur properti VaryByParam ke nilai berikut:
* = Buat versi cache yang berbeda setiap kali parameter string formulir atau kueri bervariasi.
none = Jangan pernah membuat versi cache yang berbeda
Daftar titik koma parameter = Buat versi cache yang berbeda setiap kali salah satu parameter string formulir atau kueri dalam daftar bervariasi
Membuat Profil Cache
Sebagai alternatif untuk mengonfigurasi properti cache output dengan memodifikasi properti atribut [OutputCache], Anda dapat membuat profil cache di file konfigurasi web (web.config). Membuat profil cache dalam file konfigurasi web menawarkan beberapa keuntungan penting.
Pertama, dengan mengonfigurasi penembolokan output dalam file konfigurasi web, Anda dapat mengontrol cara pengontrol melakukan tindakan cache konten di satu lokasi pusat. Anda dapat membuat satu profil cache dan menerapkan profil ke beberapa pengontrol atau tindakan pengontrol.
Kedua, Anda dapat memodifikasi file konfigurasi web tanpa mengolah ulang aplikasi Anda. Jika Anda perlu menonaktifkan penembolokan untuk aplikasi yang telah disebarkan ke produksi, maka Anda cukup memodifikasi profil cache yang ditentukan dalam file konfigurasi web. Setiap perubahan pada file konfigurasi web akan terdeteksi secara otomatis dan diterapkan.
Misalnya, bagian <konfigurasi web penembolokan> di Daftar 6 menentukan profil cache bernama Cache1Hour. Bagian <penembolokan> harus muncul di dalam bagian <system.web> dari file konfigurasi web.
Daftar 6 – Bagian penembolokan untuk web.config
<caching>
<outputCacheSettings>
<outputCacheProfiles>
<add name="Cache1Hour" duration="3600" varyByParam="none"/>
</outputCacheProfiles>
</outputCacheSettings>
</caching>
Pengontrol di Listing 7 menggambarkan bagaimana Anda dapat menerapkan profil Cache1Hour ke tindakan pengontrol dengan atribut [OutputCache].
Daftar 7 – Controllers\ProfileController.cs
using System;
using System.Web.Mvc;
namespace MvcApplication1.Controllers
{
public class ProfileController : Controller
{
[OutputCache(CacheProfile="Cache1Hour")]
public string Index()
{
return DateTime.Now.ToString("T");
}
}
}
Jika Anda memanggil tindakan Index() yang diekspos oleh pengontrol di Daftar 7, maka waktu yang sama akan dikembalikan selama 1 jam.
Ringkasan
Penembolokan output memberi Anda metode yang sangat mudah untuk meningkatkan performa aplikasi MVC ASP.NET Anda secara dramatis. Dalam tutorial ini, Anda mempelajari cara menggunakan atribut [OutputCache] untuk menyimpan output tindakan pengontrol. Anda juga mempelajari cara memodifikasi properti atribut [OutputCache] seperti properti Durasi dan VaryByParam untuk memodifikasi cara konten di-cache. Terakhir, Anda mempelajari cara menentukan profil cache dalam file konfigurasi web.