ASP.NET 웹 페이지에서 다시 게시하지 않는 클라이언트 콜백을 프로그래밍 방식으로 구현

업데이트: 2007년 11월

ASP.NET 웹 페이지의 기본 모델에서 사용자는 페이지와 상호 작용하고 단추를 클릭하거나 다시 게시가 발생하는 다른 작업을 수행합니다. 페이지 및 페이지 컨트롤이 다시 만들어지고 페이지 코드가 서버에서 실행되며 새 버전의 페이지가 브라우저에 렌더링됩니다. 그러나 경우에 따라 다시 게시를 수행하지 않고 클라이언트에서 서버 코드를 실행하는 것이 유용할 수도 있습니다. 페이지의 클라이언트 스크립트가 일부 상태 정보(예: 지역 변수 값)를 유지 관리하는 경우 페이지를 게시하고 새 복사본을 가져오면 이 상태가 소멸됩니다. 또한 페이지가 다시 게시되면 성능이 저하될 수 있는 처리 오버헤드가 발생하고 사용자는 페이지가 처리된 후 다시 만들어질 때까지 기다려야 합니다.

클라이언트 상태가 손실되지 않고 서버 라운드트립의 처리 오버헤드가 발생하지 않게 하려면 클라이언트 콜백을 수행할 수 있도록 ASP.NET 웹 페이지를 코딩하면 됩니다. 클라이언트 콜백에서 클라이언트 스크립트 함수는 ASP.NET 웹 페이지에 요청을 보냅니다. 웹 페이지에서는 해당 페이지의 정상 수명 주기의 수정된 버전을 실행합니다. 이때 페이지가 초기화되고 페이지 컨트롤 및 다른 멤버가 만들어진 다음 특별히 표시된 메서드가 호출됩니다. 이 메서드는 사용자가 코딩한 처리를 수행한 다음 다른 클라이언트 스크립트 함수에서 읽을 수 있는 값을 브라우저에 반환합니다. 전체 프로세스가 진행되는 동안 페이지는 브라우저에서 라이브 상태를 유지합니다.

일부 웹 서버 컨트롤은 클라이언트 콜백을 사용할 수 있습니다. 예를 들어 TreeView 컨트롤은 클라이언트 콜백을 사용하여 요청 시 채우기 기능을 구현합니다. 자세한 내용은 TreeView 웹 서버 컨트롤 개요를 참조하십시오.

ASP.NET 웹 페이지에서 클라이언트 콜백을 자동화하는 과정에는 여러 가지 옵션을 사용할 수 있습니다. UpdatePanel 서버 컨트롤 같은 ASP.NET의 AJAX 기능은 비동기 부분 페이지 업데이트를 자동화할 수 있으며, 웹 서비스 통신 기능은 비동기 웹 서비스 호출을 자동화할 수 있습니다.

클라이언트 콜백을 자동화하는 ASP.NET의 AJAX 기능에 대한 개요를 보려면 다음 항목을 참조하십시오.

고유한 클라이언트 스크립트를 작성하여 클라이언트 콜백을 직접 구현할 수도 있습니다. 이 항목에서는 클라이언트와 서버 간의 비동기 통신을 위해 고유한 클라이언트 콜백을 구현하는 방법에 대해 설명합니다.

클라이언트 콜백 구성 요소

클라이언트 콜백을 프로그래밍 방식으로 구현하는 ASP.NET 페이지를 만드는 방법은 일반적인 ASP.NET 페이지를 만드는 방법과 비슷하지만 다음과 같은 몇 가지 차이가 있습니다. 페이지의 서버 코드는 다음과 같은 작업을 수행해야 합니다.

  • ICallbackEventHandler 인터페이스를 구현합니다. 모든 ASP.NET 웹 페이지에 이 인터페이스 선언을 추가할 수 있습니다.

  • RaiseCallbackEvent 메서드에 대한 구현을 제공합니다. 이 메서드는 서버에서 콜백을 수행하는 데 호출됩니다.

  • GetCallbackResult 메서드에 대한 구현을 제공합니다. 이 메서드는 콜백 결과를 클라이언트에 반환합니다.

또한 다음과 같은 작업을 수행하는 세 가지 클라이언트 스크립트 함수가 페이지에 포함되어야 합니다.

  • 첫 번째 함수는 서버에 실제로 요청하는 도우미 메서드를 호출합니다. 이 함수를 사용하면 먼저 사용자 지정 논리를 수행하여 이벤트 인수를 준비한 다음 문자열을 서버측 콜백 이벤트 처리기에 매개 변수로 보낼 수 있습니다.

  • 두 번째 함수는 콜백 이벤트를 처리한 서버 코드의 결과를 받고(호출되고) 결과를 나타내는 문자열을 적용합니다. 이를 클라이언트 콜백 함수라고 합니다.

  • 세 번째 함수는 서버에 실제로 요청하는 도우미 함수입니다. 이 함수는 서버 코드에 GetCallbackEventReference 메서드를 사용하여 이 함수에 대한 참조를 생성할 때 ASP.NET에서 자동으로 생성합니다.

클라이언트 콜백과 다시 게시는 모두 원래 페이지에 대한 요청이므로 웹 서버 로그에 페이지 요청으로 기록됩니다.

서버 코드에서 필수 인터페이스 구현

다시 게시를 수행하지 않고 클라이언트 스크립트에서 서버 코드를 실행하려면 서버 코드에서 여러 인터페이스를 구현해야 합니다.

ICallbackEventHandler 인터페이스 선언

페이지에 대한 클래스 선언의 일부로 ICallbackEventHandler 인터페이스를 선언할 수 있습니다. 코드 숨김 페이지를 만들 경우에는 다음과 같은 구문을 사용하여 인터페이스를 선언할 수 있습니다.

Partial Class CallBack_DB_aspx
    Inherits System.Web.UI.Page
    Implements System.Web.UI.ICallbackEventHandler
public partial class CallBack_DB_aspx : 
    System.Web.UI.Page, System.Web.UI.ICallbackEventHandler

단일 파일 페이지 또는 사용자 정의 컨트롤로 작업 중인 경우에는 다음 예제와 같이 페이지에서 @ Implements 지시문을 사용하여 선언을 추가할 수 있습니다.

<%@ Page Language="VB" %>
<%@ Implements Interface="System.Web.UI.ICallbackEventHandler" %>
<%@ Page Language="C#" %>
<%@ Implements Interface="System.Web.UI.ICallbackEventHandler" %>
참고:

인터페이스 이름은 대/소문자를 구분합니다.

서버 콜백 메서드 만들기

서버 코드에서 RaiseCallbackEvent 메서드를 구현하는 메서드 및 GetCallbackResult 메서드를 구현하는 메서드를 만들어야 합니다. RaiseCallbackEvent 메서드는 일반적으로 이벤트 처리기에 사용되는 두 개의 인수 대신 문자열 인수 하나를 사용합니다. 다음 예제에서는 이 메서드의 일부를 보여 줍니다.

Public Sub RaiseCallbackEvent(ByVal eventArgument As String) _
    Implements System.Web.UI.ICallbackEventHandler.RaiseCallbackEvent

End Sub
public void RaiseCallbackEvent(String eventArgument)
{

}

GetCallbackResult 메서드는 인수를 사용하지 않으며 문자열을 반환합니다. 다음 예제에서는 이 메서드의 일부를 보여 줍니다.

Public Function GetCallbackResult() As String Implements _
    System.Web.UI.ICallbackEventHandler.GetCallbackResult
    Return aStringValue
End Function
public string GetCallbackResult()
{
    return aStringValue;
}

클라이언트 스크립트 함수 만들기

서버 페이지에 콜백을 보내고 결과를 받는 두 가지 기능을 수행하기 위해 페이지에 클라이언트 스크립트 함수를 추가해야 합니다. 두 클라이언트 스크립트 함수는 모두 ECMAScript(JavaScript)로 작성됩니다.

콜백 보내기

콜백을 보내는 함수는 서버 코드에서 생성됩니다. 실제 콜백은 ICallbackEventHandler 인터페이스를 구현하는 모든 페이지에서 사용할 수 있는 라이브러리 함수에 의해 수행됩니다. 페이지의 ClientScript 속성을 통해 액세스할 수 있는 페이지의 GetCallbackEventReference 메서드를 호출하여 라이브러리 함수에 대한 참조를 가져올 수 있습니다. 그런 다음 GetCallbackEventReference 메서드의 반환 값에 대한 호출을 포함하는 클라이언트 함수를 동적으로 빌드합니다. 이 메서드에 페이지에 대한 참조(C#에서는 this, Visual Basic에서는 Me), 데이터를 전달하는 데 사용할 인수의 이름, 콜백 데이터를 받을 클라이언트 스크립트 함수의 이름, 필요한 컨텍스트를 전달하는 인수 등을 전달합니다.

함수를 빌드한 경우에는 RegisterClientScriptBlock 메서드를 호출하여 페이지에 함수를 삽입합니다.

다음 예제에서는 콜백을 호출하는 CallServer 함수를 동적으로 만드는 방법을 보여 줍니다.

Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) _
    Handles Me.Load
    Dim cm As ClientScriptManager = Page.ClientScript
    Dim cbReference As String
    cbReference = cm.GetCallbackEventReference(Me, "arg", _
        "ReceiveServerData", "")
    Dim callbackScript As String = ""
    callbackScript &= "function CallServer(arg, context)" & _
        "{" & cbReference & "; }"
    cm.RegisterClientScriptBlock(Me.GetType(), _
        "CallServer", callbackScript, True)End Sub
void Page_Load(object sender, EventArgs e)
{
    ClientScriptManager cm = Page.ClientScript;
    String cbReference = cm.GetCallbackEventReference(this, "arg",
        "ReceiveServerData", "");
    String callbackScript = "function CallServer(arg, context) {" +
        cbReference + "; }";
    cm.RegisterClientScriptBlock(this.GetType(),
        "CallServer", callbackScript, true);
}

생성하는 함수가 받는 인수의 이름은 GetCallbackEventReference 메서드에 전달하는 값의 이름과 일치해야 합니다.

다음 예제에서는 콜백을 호출하고 반환 값을 처리하는 데 사용할 수 있는 태그를 보여 줍니다.

<input type="button" value="Callback" 
    onclick="CallServer(1, alert('Callback'))"/>
<br />
<span id="Message"></span>
<input type="button" value="Callback" 
    onclick="CallServer(1, alert('Callback'))"/>
<br />
<span id="Message"></span>

콜백 받기

페이지에서 정적으로 콜백을 받는 클라이언트 함수를 작성할 수 있습니다. 함수의 이름은 GetCallbackEventReference 메서드를 호출할 때 전달하는 이름과 일치해야 합니다. 콜백을 받는 함수에는 두 개의 문자열 값이 허용되는데, 하나는 반환 값이고 다른 하나는 서버에서 다시 전달되는 컨텍스트 값(선택적)입니다.

함수는 다음 예제와 같습니다.

<script type="text/javascript">
function ReceiveServerData(arg, context)
{
    Message.innerText = 'Processed callback.';
}
</script>

참고 항목

개념

클라이언트 콜백 구현 예제(Visual Basic)

클라이언트 콜백 구현 예제(C#)

참조

ClientScriptManager