ASP.NET Web API에서 서버 측 사용자 지정 HTTP 메시지 핸들러(Message Handler)를 생성하려면 System.Net.Http.DelegatingHandler 클래스를 상속받는 클래스를 만들어야 합니다.
메시지 핸들러는 HTTP 요청이 컨트롤러에 도달하기 전과 응답이 클라이언트로 반환되기 전에 요청·응답을 가로채어 처리할 수 있게 해주는 강력한 확장 지점입니다. 아래 단계별로 살펴보겠습니다.
1단계: 컨트롤러 및 액션 메서드 생성
먼저 테스트용 컨트롤러와 해당 액션 메서드를 작성합니다.
using DemoWebApplication.Models;
using System.Collections.Generic;
using System.Linq;
using System.Web.Http;
namespace DemoWebApplication.Controllers{
public class StudentController : ApiController{
List<Student> students = new List<Student>{
new Student{
Id = 1,
Name = "Mark"
},
new Student{
Id = 2,
Name = "John"
}
};
public IEnumerable<Student> Get(){
return students;
}
public Student Get(int id){
var studentForId = students.FirstOrDefault(x => x.Id == id);
return studentForId;
}
}
}2단계: 사용자 지정 메시지 핸들러 클래스 작성
다음으로 DelegatingHandler를 상속받는 CustomMessageHandler 클래스를 직접 만듭니다.
using System.Net;
using System.Net.Http;
using System.Threading;
using System.Threading.Tasks;
namespace DemoWebApplication{
public class CustomMessageHandler : DelegatingHandler{
protected async override Task<HttpResponseMessage>
SendAsync(HttpRequestMessage request, CancellationToken cancellationToken){
var response = new HttpResponseMessage(HttpStatusCode.OK){
Content = new StringContent("Result through custom message handler..")
};
var taskCompletionSource = new
TaskCompletionSource<HttpResponseMessage>();
taskCompletionSource.SetResult(response);
return await taskCompletionSource.Task;
}
}
}위 코드에서는 DelegatingHandler를 상속하는 CustomMessageHandler 클래스를 선언하고, 그 안에서 SendAsync() 메서드를 재정의(override)했습니다.
HTTP 요청이 들어오면 CustomMessageHandler가 먼저 실행되며, 요청을 더 이상 파이프라인 상위 단계로 전달하지 않고 자체적으로 HTTP 응답 메시지를 생성해 반환합니다. 결과적으로 모든 HTTP 요청이 컨트롤러의 액션 메서드까지 도달하지 못하도록 차단되는 것입니다.
실제 프로덕션 환경에서는 이런 방식 대신 기본 구현인 base.SendAsync(request, cancellationToken)를 호출한 뒤 그 결과를 가공하거나, 로깅·인증 검사 등의 부가 작업을 수행하는 패턴이 일반적으로 사용됩니다.
3단계: Global.asax에서 핸들러 등록
이제 작성한 CustomMessageHandler를 Global.asax 클래스에 등록합니다.
public class WebApiApplication : System.Web.HttpApplication{
protected void Application_Start(){
GlobalConfiguration.Configure(WebApiConfig.Register);
GlobalConfiguration.Configuration.MessageHandlers.Add(new
CustomMessageHandler());
}
}GlobalConfiguration.Configuration.MessageHandlers.Add()를 호출하면 해당 핸들러가 전역(global) 수준의 메시지 핸들러 파이프라인에 추가됩니다. 이렇게 등록된 핸들러는 모든 HTTP 요청에 대해 순서대로 실행됩니다.
4단계: 애플리케이션 실행 및 확인
애플리케이션을 실행하고 브라우저에 URL을 입력하여 결과를 확인합니다.

실행 결과 화면에서 CustomMessageHandler 클래스에 설정해 두었던 메시지가 출력되는 것을 확인할 수 있습니다. 이는 HTTP 요청이 Get() 액션 메서드에 도달하기 전에 CustomMessageHandler에서 가로채어 바로 응답을 반환했음을 의미합니다.
정리
이처럼 ASP.NET Web API에서는 DelegatingHandler를 상속하고 SendAsync()를 재정의한 뒤 MessageHandlers 컬렉션에 등록하는 것만으로 간단히 사용자 지정 메시지 핸들러를 파이프라인에 추가할 수 있습니다. 이를 활용하면 인증, 로깅, 예외 처리, 응답 헤더 추가 등 다양한 교차 관심사(cross-cutting concerns)를 중앙에서 일관되게 처리할 수 있습니다.