ASP.NET 페이지 부분 캐시

29215 단어 asp.net
때때로 전체 페이지를 캐시하는 것은 비현실적이다. 왜냐하면 페이지의 일부분은 요청할 때마다 변화가 필요할 수 있기 때문이다.이 경우 캐시 페이지의 일부분만 가능합니다.말 그대로 페이지 부분 캐시는 사용자의 요청에 응답하기 위해 메모리에 페이지 부분의 내용을 저장하는 것이고 페이지의 다른 부분의 내용은 동적 내용이다.페이지 부분 캐시의 실현은 두 가지 방식을 포함하는데 그것이 바로 컨트롤 캐시와 교체 후 캐시이다.
  1. 컨트롤 캐시(세션 캐시라고도 부른다)
캐시가 필요한 정보를 사용자 컨트롤에 포함시킨 다음, 이 사용자 컨트롤을 캐시 가능한 것으로 표시해서 페이지 출력의 일부분을 캐시할 수 있도록 합니다.이 옵션을 사용하면 전체 페이지를 캐시하지 않고 페이지의 특정한 내용을 캐시할 수 있습니다. 따라서 매번 전체 페이지를 다시 만들어야 합니다.예를 들어 대량의 동적 내용(예를 들어 주식 정보)을 표시하는 페이지를 만들려면 그 중 일부가 정적 내용(예를 들어 매주 총결산)이면 정적 부분을 사용자 컨트롤에 놓고 캐시를 허용할 수 있다.
ASP에서.NET에서는 User Control과 같은 사용자 컨트롤 기능을 제공합니다.한 페이지는 여러 User Control로 구성할 수 있습니다.하나 이상의 User Control에서 캐시를 설정하기만 하면 됩니다.
예를 들면 다음과 같습니다.
그러면 WebUser Control 1.ascx의 헤더 코드에 선언문을 추가합니다.
<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="WebUserControl1.ascx.cs"

    Inherits="WebApplication2.WebUserControl1" %>

<%@ OutputCache Duration="60" VaryByParam="none" %>

<%=DateTime.Now %> 

이 컨트롤을 호출하는 페이지 WebForm2.aspx 코드:
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm2.aspx.cs" Inherits="WebApplication2.WebForm2" %>

<%@ Register Src="~/WebUserControl1.ascx" TagName="WebUserControl1" TagPrefix="uc1" %>

<!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>

    <form id="form1" runat="server">

    <div>

        <div><%=DateTime.Now %>

        </div>

        <div><uc1:WebUserControl1 ID="WebUserControl11" runat="server" />

        </div>

    </div>

    </form>

</body>

</html>

이때 WebForm 1.ppx 페이지를 새로 고칠 때마다 페이지의 시간은 바뀌지만 사용자 컨트롤의 시간 데이터는 60초에 한 번씩 바뀐다. 이것은 페이지의'부분적'컨트롤에 캐시를 실현하고 전체 페이지가 영향을 받지 않는다는 것을 의미한다.
2. 캐시 후 교체
컨트롤 캐시와는 정반대입니다.이것은 전체 페이지를 캐시하지만, 페이지의 일부 부분은 동적이기 때문에 캐시하지 않습니다.ASP.NET 페이지에는 정적 컨텐트와 데이터베이스 데이터 기반의 동적 컨텐트가 포함됩니다.정적 컨텐트는 일반적으로 변경되지 않습니다.따라서 정적 내용에 대한 데이터 캐시를 실현하는 것은 필수적이다.그러나 데이터 기반의 동적 내용은 다르다.데이터베이스에 있는 데이터는 시시각각 변화할 수 있기 때문에 동적 내용도 캐시를 실현하면 데이터가 제때에 업데이트되지 못하는 문제를 초래할 수 있다.이 문제에 대해 앞에서 말한 컨트롤 캐시 방법을 사용하면 실제와 부합되지 않을 뿐만 아니라 실현하기가 매우 번거롭고 오류가 발생하기 쉽다.
캐시 페이지의 대부분 내용을 캐시하지 않고 캐시 페이지의 일부 부분을 어떻게 실현합니까?ASP.NET 2.0은 캐시 교체 기능을 제공합니다.다음 세 가지 방법으로 이 기능을 수행할 수 있습니다.
하나는 선언 방식으로 Substitution 컨트롤을 사용하는 것입니다.
두 번째는 Substitution 컨트롤 API를 프로그래밍 방식으로 사용하는 것입니다.
세 번째는 컨트롤을 은밀하게 사용하는 것이다.
앞의 두 가지 방법의 핵심은 Substitution 컨트롤이다. 이 절은 이 컨트롤을 중점적으로 소개하고 세 번째 방법은 컨트롤에 내장되어 지원되는 캐시 교체 기능에만 집중하며 이 절은 간략한 설명만 한다.
(1) Substitution 컨트롤 적용
애플리케이션 성능을 향상시키기 위해 전체 ASP를 캐시할 수 있습니다.NET 페이지. 또한 요청마다 페이지의 특정한 부분을 업데이트해야 할 수도 있습니다.예를 들어 페이지의 상당 부분을 캐시하려면 이 페이지의 시간이나 사용자의 높이와 관련된 정보를 동적으로 업데이트해야 한다.이 경우 Substitution 컨트롤을 사용하는 것이 좋습니다.Substitution 컨트롤은 페이지 출력 캐시에서 이 컨트롤을 동적 내용으로 대체해야 하는 부분을 지정할 수 있습니다. 즉, 전체 페이지에 출력 캐시를 허용하고, Substitution 컨트롤을 사용하여 페이지의 캐시가 없는 부분을 지정할 수 있습니다.캐시가 필요한 영역은 한 번만 실행한 다음 캐시에서 캐시 항목이 만료되거나 지워질 때까지 읽습니다.Substitution 컨트롤에 지정된 동적 영역은 페이지를 요청할 때마다 실행됩니다.Substitution 컨트롤은 캐시 섹션 페이지에 대한 간단한 솔루션을 제공합니다.
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm2.aspx.cs" Inherits="WebApplication2.WebForm2" %>

<%@ OutputCache Duration="60" VaryByParam="none" %>

<!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>

    <form id="form1" runat="server">

    <div>

        <div><%=DateTime.Now %>

        </div>

        <div>

             Substitution         :<asp:Substitution ID="Substitution1" runat="server" MethodName="getCurrentTime" />

        </div>

    </div>

    </form>

</body>

</html>
using System;

using System.Collections.Generic;

using System.Linq;

using System.Web;

using System.Web.UI;

using System.Web.UI.WebControls;



namespace WebApplication2

{

    public partial class WebForm2 : System.Web.UI.Page

    {

        protected void Page_Load(object sender, EventArgs e)

        {

        }

        public static string getCurrentTime(HttpContext context) 

        { 

            return DateTime.Now.ToString(); 

        }

    }

}

위 코드와 같이 Substitution 컨트롤에는 MethodName 이라는 중요한 속성이 있습니다.이 등록 정보는 Substitution 컨트롤이 실행될 때 콜백을 위해 호출되는 메소드 이름을 가져오거나 설정하는 데 사용됩니다.이 방법은 비교적 특수하여 다음과 같은 세 가지 표준에 부합해야 한다.
⑥ 이 메서드는 정적 메서드로 정의되어야 합니다.
⑥ 이 메서드는 HttpContext 유형의 매개변수를 수락해야 합니다.
⑥ 이 메서드는 String 유형의 값을 반환해야 합니다.
실행 중인 경우 Substitution 컨트롤에서 MethodName 속성에 정의된 메서드를 자동으로 호출합니다.이 메서드는 페이지의 Substitution 컨트롤 위치에 표시할 문자열을 반환합니다.만약 페이지에 캐시 모든 출력을 설정하면, 첫 번째 요청 시, 이 페이지는 그 출력을 실행하고 캐시합니다.후속 요청은 캐시를 통해 완료되며, 이 페이지의 다른 코드는 다시 실행되지 않습니다.그러나 Substitution 컨트롤과 관련된 방법은 요청할 때마다 실행되고 이 컨트롤이 표시하는 동적 내용을 자동으로 업데이트하여 전체 캐시, 부분적인 변화의 교체 효과를 실현한다.
위 코드와 같이 코드 헤더에서 @ OutputCache 명령을 통해 페이지 출력 캐시 만료 시간을 5초로 설정합니다. 이것은 전체 페이지 데이터에 캐시 기능이 적용되었음을 의미합니다.따라서 '페이지 캐시 시간' 에 표시되는 시간 값은 데이터 캐시에서 나온다.이 시간 값은 페이지를 새로 고침하는 데 따라 달라지지 않으며 캐시가 만료될 때만 업데이트됩니다.Substitution 컨트롤의 MethodName 속성 값은 getCurrentTime입니다.이 컨트롤은 getCurrentTime 메서드의 반환 값에서 컨텐트를 표시합니다.특히 중요한 것은 페이지에 출력 캐시 기능이 설정되어 있지만 페이지가 새로 고칠 때마다 ASP.NET 실행 엔진은 Substitution 컨트롤을 다시 실행하고 MethodName 속성 값에 지정된 메소드 반환 값을 페이지에 표시하므로 최신 시간이 표시됩니다.
페이지가 새로 고침됨에 따라 실제 시간은 변하고, 페이지 캐시 시간은 지정한 캐시 시간 내에 변하지 않습니다.
참고:
⑥ Substitution 컨트롤은 페이지의 다른 컨트롤에 액세스할 수 없습니다. 즉, 다른 컨트롤의 값을 확인하거나 변경할 수 없습니다.그러나 코드는 현재 페이지의 상하문에 접근하기 위해 전달된 파라미터를 사용할 수 있습니다.
⑥ 캐시 페이지에 포함된 사용자 컨트롤에 Substitution 컨트롤을 포함할 수 있습니다.그러나 Substitution 컨트롤은 출력 캐시 사용자 컨트롤에 배치할 수 없습니다.
⑥ Substitution 컨트롤은 정의된 메서드의 반환 문자열에 따라 위치에 표시되는 태그가 표시되지 않습니다.
(2) Substitution 컨트롤 API 적용
이전 소절에서는 Substitution 컨트롤을 사용하여 캐시 후 교체를 선언하는 응용 프로그램에 대해 설명합니다.이 절에서는 또 다른 실현 방법을 설명한다.이 방법의 핵심은 프로그래밍 방식으로 Substitution 컨트롤 API를 이용하여 캐시 후 교체를 실현하는 것으로, 성명 방식으로 Substitution 컨트롤을 사용하는 방법보다 유연성이 강하다.
Substitution에 대한 콜백 방법을 지정하여 선언과 동일한 효과를 구현합니다.Substitution의 콜백 방법은 다음과 같아야 합니다.
HttpResponseSubstitutionCallback 위임 정의 메서드는
⑥ 반환 값은 String이어야 합니다.
⑥ 2는 매개변수가 있고 하나뿐이며 HttpContext 유형입니다.
캐시된 출력 응답에 대해 동적으로 지정된 응답 영역을 프로그래밍해야 할 경우 페이지 코드에서 메서드(즉 콜백 메서드)의 이름을 매개 변수(Http Response Substitution Callback)로 Substitution에 전달할 수 있습니다.이렇게 하면 Substitution은 콜백 방법을 사용하고 콜백 방법의 반환 값을 지정된 위치의 대체 내용으로 표시할 수 있다.
주의해야 할 것은 리셋 방법은 반드시 라인이 안전해야 한다는 것이다. 용기의 페이지나 사용자 컨트롤의 정적 방법일 수도 있고, 다른 임의의 대상의 정적 방법이나 실례적인 방법일 수도 있다.
다음은 출력 캐시 페이지에 Substitution 컨트롤을 프로그래밍 방식으로 추가하는 것을 보여 줍니다.(1) Substitution 컨트롤 적용에 표시된 예와 동일한 기능을 수행합니다.다른 것은 실현 방식이다.
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm2.aspx.cs" Inherits="WebApplication2.WebForm2" %>

<%@ OutputCache Duration="60" VaryByParam="none" %>

<!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>

    <form id="form1" runat="server">

    <div>

        <div><%=DateTime.Now %>

        </div>

        <div>

             Substitution  API     :<asp:PlaceHolder ID="PlaceHolder1" runat="Server"></asp:PlaceHolder>

        </div>

    </div>

    </form>

</body>

</html>
using System;

using System.Collections.Generic;

using System.Linq;

using System.Web;

using System.Web.UI;

using System.Web.UI.WebControls;



namespace WebApplication2

{

    public partial class WebForm2 : System.Web.UI.Page

    {

        protected void Page_Load(object sender, EventArgs e)

        {

            //    Substitution    

            Substitution Substitution1 = new Substitution();    

            //              

            Substitution1.MethodName = "getCurrentTime";              

            PlaceHolder1.Controls.Add(Substitution1);           

        }

        public static string getCurrentTime(HttpContext context) 

        { 

            return DateTime.Now.ToString(); 

        }

    }

}

위 코드와 같이 페이지는 @ OutputCache 명령을 사용하여 60초 동안 데이터 캐시를 구성하는 출력 캐시 기능을 설정합니다.그러나 페이지의 다른 내용은 캐시되고 Substitution에서 호출된 리셋 방법으로 표시된 내용은 캐시되지 않습니다.

좋은 웹페이지 즐겨찾기