본문 바로가기

Programming/.NET

[ASP.NET] HttpModule, HttpHandler

클라이언트가 서버(ASP.NET)에 어떤 특정한 요청을 던져주는 경우 해당 요청은 최종 HTTP응답페이지를 생성하기 전에 여러 필요한 모듈을 거처 요청이 처리될 수 있는 과정을 거치게 됩니다. HttpModule은 HTTP요청이 처리되는 동안 ASP.NET에서 발생하는 이벤트를 활용하여 필요한 처리를 수행하도록 합니다.

 

HttpModule을 생성하려면 Visual Studio의 Add New Item대화상자에서 ASP.NET Module을 선택하면 됩니다.

 

 

페이지를 추가하고 나면 아래와 같은 코드를 볼 수 있습니다.

 

public void Init(HttpApplication context)
{
    // Below is an example of how you can handle LogRequest event and provide 
    // custom logging implementation for it
    context.LogRequest += new EventHandler(OnLogRequest);
}

 

Init 메소드를 Module의 시작점입니다. 여기에서 필요한 이벤트를 등록하고 프로그램 처리로직을 작성하게 됩니다. 아래는 Init에서 등록할 수 있는 이벤트내용입니다.

 

 AcquireRequestState

 세션상태를 가져오는 경우 발생

 AuthenticateRequest

 사용자 인증시 발생

 AuthorizeRequest

 사용자에게 권한을 부여하는 경우 발생

 BeginRequest

 신규 HTTP요청시 발생

 Disposed

 HTTP처리를 완료할때 발생

 EndRequest

 사용자에게 HTTP응답을 전송하기 직전에 발생

 Error

 제어되지 않은 예외발생시 발생

 PostRequestHandlerExecute

 HTTP처리기가 실행을 완료한 직후 발생

 PreRequestHandlerExecute

 HTTP요청의 이벤트 처리기를 실행하기 직전에 발생

 PreSendRequestContent

 사용자에게 HTTP응답 컨텐츠를 전송하기 직전에 발생

 PreSendRequestHeaders

 사용자에게 HTTP응답 헤더를 전송하기 직전에 발생

 

모듈을 테스트하기 위해 아래와 같이 모듈을 수정하도록 합니다.

 

HttpApplication httpApplication = null;
 /// <summary>
 /// You will need to configure this module in the Web.config file of your
 /// web and register it with IIS before being able to use it. For more information
 /// see the following link: http://go.microsoft.com/?linkid=8101007
 /// </summary>
 #region IHttpModule Members

 public void Dispose()
 {
     //clean-up code here.
 }

 public void Init(HttpApplication context)
 {
     httpApplication = context;
     // Below is an example of how you can handle LogRequest event and provide 
     // custom logging implementation for it
     context.LogRequest += new EventHandler(OnLogRequest);
     context.EndRequest += Context_EndRequest;
 }

 private void Context_EndRequest(object sender, EventArgs e)
 {

     httpApplication.Context.Response.Write("HI CLIEL!!");
 }

 #endregion

 public void OnLogRequest(Object source, EventArgs e)
 {
     //custom logging logic can go here
 }

 

Init 메소드에는 HttpApplication 개체가 전달되는데 모듈은 이 개체에 접근하여 요청이 처리되는 동안 특정 이벤트를 전달하여 필요한 처리를 수행하게 됩니다. 예제에서는 EndRequest 이벤트를 등록하여 사용자에게 HTTP응답 컨텐츠가 전송되기 직전 "HI CLIEL!!"이라는 문자열을 생성하여 응답 컨텐츠에 포함시켜 결과를 전송하도록 하였습니다.

 

모듈을 작성하고 나면 해당 모듈을 web.config에 아래와 같이 등록하여 요청이 해당 모듈을 거칠 수 있도록 해야 합니다.

 

<system.webServer>
  <modules>
    <add name="MyModule" type="web_form_test.MyModule" />
  </modules>
</system.webServer>

 

이렇게 하면 모든 요청이 MyModule 모듈을 거치게 되고 응답으로 되돌아 오는 결과마다 "HI CLIEL!!"이라는 문구가 추가되어 반환될 것입니다.

 

HttpHandler는 HttpModule과 달리 최종 결과를 위한 것입니다. 그래서 Handler는 특정 확장자를 가진 페이지내부에서 특정 결과를 만들어 내는데 사용됩니다.

 

Visual Studio에서 HttpHandler를 등록하려면 Add New Item대화상자에서 Generic Handler를 선택합니다. 제네릭 처리기(Generic Handler)는 기본 확장자가 ashx입니다.

 

 

아래는 기본적으로 생성된 Generic Handler의 내용입니다.

 

public class Handler : IHttpHandler
{

    public void ProcessRequest(HttpContext context)
    {
        context.Response.ContentType = "text/plain";
        context.Response.Write("Hello World");
    }

    public bool IsReusable
    {
        get
        {
            return false;
        }
    }
}

 

보시는 바와같이 Handler는 IHttpHandler 인터페이스를 구현하고 있고 이에 필요한 ProcessRequest메소드와 IsReusable속성을 가지고 있습니다.

 

ProcessRequest메소드는 요청으로 들어오는 HTTP요청을 직접적으로 처리하는 메소드로서 기본적으로 결과 컨텐츠를 text/plain 형으로 변경하고 Hello World를 출력하도록 되어 있으며 IsReusable속성은 HttpHandler 개체의 재사용여부를 설정하는 속성입니다.

 

이 handler에 대한 ashx페이지를 추가하고 브라우저에서 호출하면 Hellw World라는 문자열이 출력됨을 확인할 수 있습니다. ashx를 설명할때 가장 많이 사용하는 예제가 이미지 출력인데 여기서도 이미지 출력에 대한 예를 살펴보도록 하겠습니다.

 

프로젝트에 임의의 이미지파일을 하나 추가하고 다음과 같이 handler의 코드를 수정합니다.

 

public void ProcessRequest(HttpContext context)
{
    context.Response.ContentType = "image/jpeg";
    context.Response.WriteFile("21471517501_555eb3653a_o.jpg");
}

 

요청을 image/jpeg로 바꾸고 해당 이미지를 출력하도록 하였습니다. 이건 다음과 같이 특정 페이지에 삽입되어 원하는 이미지를 출력하는 용도로도 사용될 수 있습니다.

 

<!DOCTYPE html>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <img src="Handler.ashx" alt="이미지" />
    </div>
    </form>
</body>
</html>

 

필요하다면 Handler.ashx?param=123 처럼 특정 쿼리스트링을 통해서 동적으로 출력되는 이미지를 조정하는 것도 가능할 것입니다.

'Programming > .NET' 카테고리의 다른 글

[ASP.NET] 서버 컨트롤 - 7 (형변환)  (0) 2017.02.22
[ASP.NET] 서버 컨트롤 - 6 (컨트롤)  (0) 2017.02.08
[ASP.NET] HttpModule, HttpHandler  (0) 2017.02.02
[ASP.NET] AJAX  (0) 2017.01.24
[ASP.NET] 캐시 - 2  (0) 2017.01.17
[ASP.NET] ExecuteXmlReader  (0) 2017.01.13