-
대체 컨트롤을 사용하면 동적으로 업데이트되고 나중에 캐시된 페이지에 통합될 수 있는 웹 페이지 영역을 만들 수 있습니다.
1. 계획
대체 컨트롤을 사용하여 동적 콘텐츠의 출력을 캐시하려는 웹 페이지 부분을 지정합니다. 대부분의 콘텐츠가 캐시되는 페이지의 경우 대체 컨트롤은 부분 페이지 캐싱을 위한 단순화된 솔루션을 제공합니다. 전체 페이지의 출력을 캐시한 다음 대체 컨트롤을 사용하여 캐시되지 않은 페이지 부분을 지정할 수 있습니다. 캐시 영역은 한 번만 실행되며 캐시 항목이 만료되거나 지워질 때까지 캐시에서 읽혀집니다. 페이지가 요청될 때마다 동적 영역이 실행됩니다. 이 캐싱 모델은 정적 콘텐츠를 캐시에 넣기 위해 웹 사용자 정의 컨트롤에 캡슐화할 필요가 없기 때문에 콘텐츠가 대부분 정적인 웹 페이지의 코딩을 단순화합니다. 예를 들어 이 캐싱 모델은 정적 콘텐츠(예: 뉴스 기사)가 포함된 웹 페이지와 광고를 표시하는 AdRotator 컨트롤에 유용합니다. 뉴스 기사는 자주 변경되지 않으므로 캐시될 수 있습니다. 사용자가 페이지를 요청할 때마다 새 광고를 표시할 수 있습니다. AdRotator 컨트롤은 웹페이지의 캐시 여부에 관계없이 웹페이지의 각 포스트백에서 새 광고를 렌더링하는 캐시 후 교체를 직접 지원합니다.
2. 배경
ASP.NET 웹 페이지를 캐시하면 기본적으로 페이지의 모든 출력이 캐시됩니다. 첫 번째 요청에서 페이지가 실행되고 해당 출력이 캐시됩니다. 후속 요청의 경우 이는 캐싱을 통해 수행되며 해당 페이지의 코드는 실행되지 않습니다.
경우에 따라 ASP.NET 웹 페이지를 캐시할 뿐만 아니라 페이지가 요청될 때마다 페이지의 선택된 부분을 업데이트할 수도 있습니다. 예를 들어, 페이지의 많은 부분을 캐시하고 싶지만 페이지에서 매우 시간에 민감한 정보를 동적으로 업데이트해야 할 수 있습니다.
대체 컨트롤을 사용하여 캐시된 페이지에 동적 콘텐츠를 삽입할 수 있습니다. 대체 컨트롤은 마크업을 렌더링하지 않습니다. 따라서 웹 페이지 또는 상위 사용자 컨트롤의 메서드에 컨트롤을 바인딩해야 합니다. 웹 페이지에 삽입할 정보를 반환하는 정적 메서드를 만들어야 합니다. 대체 컨트롤에 의해 호출되는 메서드는 다음 기준을 충족해야 합니다.
·정적 메서드여야 합니다(Visual Basic에서 공유됨).
·HttpContext 유형의 매개변수를 승인해야 합니다.
·문자열 유형의 값을 반환해야 합니다.
대체 컨트롤은 웹 페이지의 다른 컨트롤에 액세스할 수 없습니다. 즉, 다른 컨트롤의 값을 검사하거나 변경할 수 없습니다. 그러나 코드는 전달된 매개변수를 사용하여 현재 페이지의 컨텍스트에 액세스할 수 있습니다.
페이지가 실행되면 대체 컨트롤이 이 메서드를 호출한 다음 페이지의 대체 컨트롤을 메서드의 반환 값으로 바꿉니다.
코드 예
다음 예제에서는 Substitution 컨트롤을 사용하여 캐시된 페이지에서 동적으로 업데이트 가능한 콘텐츠를 만드는 방법을 보여줍니다. 페이지의 Load 이벤트 코드는 Label 컨트롤을 현재 시간으로 업데이트합니다. 페이지의 캐시 기간이 60초로 설정되었기 때문에 페이지가 60초 내에 여러 번 요청되더라도 Label 컨트롤의 텍스트는 변경되지 않습니다. 페이지의 대체 컨트롤은 현재 시간을 문자열로 반환하는 정적 메서드 GetTime을 호출합니다. 웹 페이지를 새로 고칠 때마다 대체 컨트롤이 나타내는 값이 업데이트됩니다.
<%@ 페이지 언어="C#" %>
<%@ OutputCache 기간=60 VaryByParam="없음" %>
<스크립트 runat="서버">
무효 Page_Load()
{
Label1.Text = DateTime.Now.ToString();
}
공개 정적 문자열 GetTime(HttpContext 컨텍스트)
{
DateTime.Now.ToString()을 반환합니다.
}
</script>
<html>
<head runat="서버"></head>
<본문>
<form id="form1" runat="서버">
<div>
<p>
<asp:라벨 runat="서버" ID="Label1" />
</p>
<p>
<asp:대체 runat="서버"
ID="대체1"
MethodName="GetTime" />
</p>
<p>
<asp:Button runat="서버" ID="Button1" Text="제출"/>
</p>
</div>
</form>
</body>
</html>
3. 대체 클래스
대체 컨트롤을 사용하여 컨트롤을 동적 콘텐츠로 바꾸려는 출력 캐시 웹 페이지 부분을 지정합니다. 대체 컨트롤은 대부분의 콘텐츠가 캐시되는 페이지에 대해 부분 페이지를 캐시하기 위한 단순화된 솔루션을 제공합니다. 전체 페이지를 캐시에 출력한 다음 대체 컨트롤을 사용하여 캐싱에서 제외되는 페이지 부분을 지정할 수 있습니다. 캐시해야 하는 영역은 한 번만 실행된 다음 캐시 항목이 만료되거나 지워질 때까지 캐시에서 읽습니다. 페이지가 요청될 때마다 동적 영역이 실행됩니다. 이 캐싱 모델은 웹 사용자 컨트롤의 캐싱을 위해 이러한 부분을 캡슐화할 필요가 없기 때문에 주로 정적 콘텐츠가 포함된 페이지의 코드를 단순화합니다. 예를 들어, 이 캐싱 모델은 페이지에 정적 콘텐츠(예: 뉴스 기사)와 광고를 표시하는 AdRotator 컨트롤이 포함된 경우 유용합니다. 뉴스 기사는 변경되지 않으므로 캐시될 수 있습니다. 그러나 사용자가 페이지를 요청할 때마다 새 광고를 표시하려고 합니다. AdRotator 컨트롤은 페이지 캐시 여부에 관계없이 페이지가 포스트백될 때 새 광고를 렌더링하는 캐시 후 교체를 직접 지원합니다.
참고: 대체 컨트롤은 캐시 페이지에 포함된 사용자 컨트롤에 배치될 수 있습니다. 그러나 출력 캐시 사용자 정의 컨트롤 내에 대체 컨트롤을 배치할 수는 없습니다.
대체 컨트롤이 실행되면 문자열을 반환하는 메서드가 호출됩니다. 이 메서드에서 반환되는 문자열은 페이지의 대체 컨트롤 위치에 표시되는 콘텐츠입니다. MethodName 속성을 사용하여 Substitution 컨트롤이 실행될 때 호출될 콜백 메서드의 이름을 지정합니다. 지정된 콜백 메서드는 대체 컨트롤이 포함된 페이지 또는 사용자 정의 컨트롤의 정적 메서드여야 합니다. 콜백 메서드의 서명은 HttpContext 매개 변수를 받아들이고 문자열을 반환하는 HttpResponseSubstitutionCallback 대리자의 서명과 일치해야 합니다.
페이지의 출력 캐시를 작동하려면 @OutputCache 지시문, HttpCachePolicy 클래스 또는 Cache 속성을 사용할 수 있습니다.
Substitution 컨트롤을 사용하는 또 다른 방법은 HttpResponseSubstitutionCallback 대리자를 사용하여 캐시 교체 동작을 구현하는 것입니다. 또한 AdRotator 컨트롤과 같이 캐시 교체 기능을 직접 지원하는 컨트롤에서 캐시 교체 동작을 구현할 수 있습니다.
예
다음 코드 예제에서는 출력 캐시 웹 페이지에 대체 컨트롤을 선언적으로 추가하는 방법을 보여줍니다. 페이지가 로드되면 사용자에게 탭에 현재 날짜와 시간이 표시됩니다. 페이지의 이 영역은 60초마다 캐시되고 업데이트됩니다. 대체 컨트롤이 실행되면 GetCurrentDateTime 메서드가 호출됩니다. GetCurrentDateTime에서 반환된 문자열이 사용자에게 표시됩니다. 페이지의 이 부분은 페이지를 새로 고칠 때마다 캐시 및 업데이트되지 않습니다.
<%@outputcacheduration="60"varibyparam="none"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
" http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd ">
<script runat="서버" 언어="C#">
void Page_Load(개체 전송자, System.EventArgs e)
{
// 현재 날짜와 시간을 라벨에 표시합니다.
// 출력 캐싱은 페이지의 이 섹션에 적용됩니다.
CachedDateLabel.Text = DateTime.Now.ToString();
}
// 대체 컨트롤은 이 메서드를 호출하여 검색합니다.
// 현재 날짜와 시간입니다.
// 출력 캐싱에서 제외됩니다.
공개 정적 문자열 GetCurrentDateTime(HttpContext 컨텍스트)
{
DateTime.Now.ToString()을 반환합니다.
}
</script>
<html>
<head runat="서버">
<title>대체 클래스 예시</title>
</head>
<본문>
<form id="form1" runat="서버">
<h3>대체 클래스 예시</h3>
<p>페이지의 이 섹션은 캐시되지 않습니다:</p>
<asp:대체 id="대체1"
메소드명="GetCurrentDateTime"
runat="서버">
</asp:대체>
<br />
<p>페이지의 이 섹션이 캐시되었습니다:</p>
<asp:label id="CachedDateLabel"
runat="서버">
</asp:라벨>
<br /><br />
<asp:버튼 id="새로고침버튼"
text="페이지 새로 고침"
runat="서버">
</asp:버튼>
</form>
</body>