Asp.Net IHttpHandler가 도입되었습니다 Http 요청에 응답할 때 일반적으로 사용되는 두 가지 처리 인터페이스 ASP.NET IHttpHandler와 IHttpModule입니다.
일반적으로 IHttpHandler는 각 *.asp, *.aspx 파일의 별도 처리와 같은 특정 유형의 요청을 처리하는 데 사용됩니다. IHttpModule은 일반적으로 요청 페이지에서 동일한 검사를 수행하는 것과 같은 작업에 사용됩니다.
해당 HTTP 요청을 보낼 때 IIS 서버의 처리 단계를 살펴보겠습니다. ASP.NET 파이프라인 개념을 가지고 있는데, 이는 각 ASP.NET 요청이 IIS에서 일련의 대응 연산을 통해 선과 같은 시퀀스를 형성한다는 의미입니다.
ASP.NET 파이프라인 도입
파이프라인의 처리 타이밍 다이어그램을 살펴보겠습니다:
그림에서 볼 수 있듯이, 요청이 도착한 후 구현은 HttpModule에서 처리되고 HttpHandler의 ProcessRequest() 메서드를 호출하여 특정 응답을 수행합니다. 따라서 클래스별 요청 처리는 HttpHandler 클래스에 배치되고, HttpModule 내 모든 요청에 공통적으로 적용되는 검사는 수행하는 이유를 쉽게 이해할 수 있습니다.
코드 실무
IHttp핸들러
저자는 최근 프로젝트에서 클라이언트 인터페이스 호출을 처리하기 위해 IHttpHandler를 사용하는 사례를 접했으니, IHttpHandler를 기반으로 한 간단한 인터페이스 설계에 대해 간단히 논의해 보겠습니다.
IHttpHandler 인터페이스는 단 두 개의 멤버만 가지고 있습니다:
IsReuseable 속성은 HttpHandler 객체가 다른 인스턴스에서 사용할 수 있는지 여부를 식별하며, 보통 True로 설정합니다. ProcessRequest() 메서드는 요청에 대한 특정 응답이며, 여기에 특정 비즈니스 로직 연산만 넣으면 됩니다.
먼저, 새로운 웹 프로젝트를 만들고 핸들러 클래스를 추가하세요:
RayHandler 클래스는 IHttpHandler 인터페이스의 ProcessRequest() 함수를 구현하는데, 이는 텍스트 조각의 직접 출력입니다.
그 다음 Web.config 파일에 다음과 같은 구성을 추가해야 합니다:
path는 URL 매칭을 나타내며, *.ray와 같이 핸들러가 ".ray"로 끝나는 URL 요청에 응답합니다. verb는 Get/Post와 같은 요청 메서드를, *는 모두 일치함을 의미합니다. type은 Handler 클래스의 타입을 나타내며, WebApplication2는 RayHandler입니다. RayHandler는 클래스명이고, WebApplication2는 Bin 디렉터리에 있는 어셈블리 이름을 의미합니다. 예를 들어, 예제에서 어셈블리 이름은 WebApplication2.dll이고, 여기서 접미사 이름을 정의할 필요가 없습니다.
사이트를 시작하고, 끝이 ".ray"로 끝나는 URL을 입력하면 다음과 같은 결과를 볼 수 있습니다:
IHttp핸들러 공장 개요
때로는 여러 개의 서로 다른 접미사를 다뤄야 할 때가 있는데, 하나는 핸들러 클래스에 해당하며, 우리의 Web.config 파일은 다음과 같습니다:
HttpHandler 구현 클래스가 많으면 Web.config 파일 구성이 장황하게 보일 수밖에 없습니다. 또는 프로그램이 실행 중일 때만 어떤 핸들러가 응답하는지 알 수 있는 경우에는 IHttpHandlerFactory를 사용해야 합니다.
IHttpHandler Factory는 다음과 같이 정의됩니다:
그 중에는 다음과 같은 인물들이 있습니다:
GetHandler(): IHttpHandler 인터페이스를 구현한 인스턴스를 반환합니다; ReleaseHandler(): Factory가 기존 핸들러 인스턴스를 재사용할 수 있게 합니다. 위의 ray와 rss 요청을 예로 들면, Factory 클래스를 구현하자:
이 경우 Web.config의 구성은 다음과 같습니다:
이 시점에서 Factory 클래스를 특정 핸들러에 대응하는 기능이 구현되어 구성이 단순화되었습니다.
확장 가능한 IHttp핸들러 팩토리
위 구현에서 프로그램이 앞으로 새로운 접미사 처리 메서드를 추가해야 할 경우, GetHandler()의 Switch 문도 수정해야 하며, 이 경우에도 오류를 일으키거나 다른 보안 위험을 초래할 수 있습니다. 그렇다면 이후 확장에서도 HandlerFactory 클래스를 변경하지 않고 유지하는 것이 가능할까요?
답은 확실히 그렇습니다. 디자인 패턴에 익숙한 독자라면 이것이 단순한 공장 패턴임을 이해해야 하며, 앞서 언급한 기능을 달성하기 위해 고급 포인트(advanced points)라는 디자인 모드를 사용할 수 있습니다.
여기서는 C# 언어의 언어 기능인 반사(reflection)도 사용할 수 있습니다. C#의 반사 메커니즘을 통해 URL의 접미사에 따라 대응하는 Hanlder 타입을 반영하며, 단, URL 접미사 이름과 핸들러 클래스 이름 간의 대응에 합의할 수 있습니다.
예를 들어, GetHandler()를 다음과 같이 다시 작성합니다:
이 경우에는 Handler 클래스를 메서드에 Handler 클래스를 HandlerFactory 클래스와 같은 네임스페이스 안에 넣고 Web.config에서 올바르게 설정하기만 하면 됩니다. 예를 들어, RayHandler 클래스가 있다면 다음과 같은 구성을 추가하여 자동으로 일치해야 합니다:
요약 이 글에서는 ASP.NET 에서 IHttpHandler의 사용을 간략히 소개하고, 여러 핸들러 요청을 처리하는 데 IHttpHandlerFactory 구현을 제공하며, 마지막으로 C#의 반사 메커니즘을 활용한 확장 가능한 다중 요청 핸들러 구현을 개선합니다.
|