HttpClient 메시지 처리기
- 본 번역문서의 원문은 HttpClient Message Handlers www.asp.net 입니다.
메시지 처리기(Message Handler)는 HTTP 요청을 받아서 HTTP 응답을 반환하는 클래스입니다.
일반적으로 일련된 메시지 처리기들은 서로 연결되어 물려 있습니다. 첫 번째 처리기가 HTTP 요청을 받아서 특정 처리를 수행한 다음, 다시 요청을 다음 처리기로 넘겨줍니다. 이런 상황이 반복되다가 특정 시점에 응답이 생성되고, 이번에는 다시 반대로 연결을 거슬러 되돌아가게 됩니다. 이런 패턴을 위임(Delegating) 처리기라고 부릅니다.
클라이언트 측에서 HttpClient 클래스는 요청 처리를 위해서 메시지 처리기를 사용합니다. 기본 처리기는 네트워크 너머로 요청을 전송하고 서버로부터 응답을 받는 HttpClientHandler 입니다. 물론, 클라이언트 파이프라인에 사용자 정의 메시지 처리기를 추가할 수도 있습니다:
사용자 정의 메시지 처리기
사용자 정의 메시지 처리기를 작성하려면, System.Net.Http.DelegatingHandler 클래스를 상속 받아서 SendAsync 메서드를 재작성해야 합니다. 다음은 메서드 시그니쳐입니다:
Task<HttpResponseMessage> SendAsync( HttpRequestMessage request, CancellationToken cancellationToken);
이 메서드는 HttpRequestMessage를 입력받아서 비동기적으로 HttpResponseMessage를 반환합니다. 일반적인 구현은 다음과 같습니다:
- 요청 메시지를 처리합니다.
base.SendAsync
를 호출해서 요청을 내부 처리기로 전달합니다.- 내부 처리기가 응답 메시지를 반환합니다. (이 과정은 비동기적으로 처리됩니다.)
- 응답을 처리한 다음, 이를 호출자에게 반환합니다.
다음 예제는 외부로 나가는 요청에 사용자 정의 헤더를 추가하는 메시지 처리기를 보여줍니다:
class MessageHandler1 : DelegatingHandler { private int _count = 0; protected override Task<HttpResponseMessage> SendAsync( HttpRequestMessage request, System.Threading.CancellationToken cancellationToken) { _count++; request.Headers.Add("X-Custom-Header", _count.ToString()); return base.SendAsync(request, cancellationToken); } }
이 예제에서 base.SendAsync
호출은 비동기적으로 처리됩니다.
만약, 이 호출 이후에 처리기가 수행하는 작업이 존재한다면, await 키워드를 사용해서 이 메서드 호출이 완료된 이후에 실행을 계속하십시요.
가령, 다음 예제는 오류 코드 로그를 남기는 처리기를 보여주고 있습니다.
로그를 남기는 작업 자체는 그다지 흥미로운 부분이 없지만, 이 예제를 통해서 처리기 내부에서 응답의 정보들을 가져오는 방법을 살펴볼 수 있습니다.
class LoggingHandler : DelegatingHandler { StreamWriter _writer; public LoggingHandler(Stream stream) { _writer = new StreamWriter(stream); } protected override async Task<HttpResponseMessage> SendAsync( HttpRequestMessage request, System.Threading.CancellationToken cancellationToken) { var response = await base.SendAsync(request, cancellationToken); if (!response.IsSuccessStatusCode) { _writer.WriteLine("{0}\t{1}\t{2}", request.RequestUri, (int)response.StatusCode, response.Headers.Date); } return response; } protected override void Dispose(bool disposing) { if (disposing) { _writer.Dispose(); } base.Dispose(disposing); } }
클라이언트 파이프라인에 메시지 처리기 추가하기
사용자 정의 처리기를 HttpClient에 추가하려면, HttpClientFactory.Create 메서드를 사용합니다:
HttpClient client = HttpClientFactory.Create(new Handler1(), new Handler2(), new Handler3());
메시지 처리기들은 Create 메서드에 전달된 순서 그대로 호출됩니다. 처리기들은 중첩되어 있기 때문에, 응답 메시지는 반대 방향으로 이동합니다. 즉, 가장 마지막 처리기가 가장 첫 번째로 응답 메시지를 받습니다.
- 여러분의 첫 번째 ASP.NET Web API (C#) 2013-05-27 20:30
- CRUD 작업을 지원하는 Web API 작성하기 2013-06-14 20:30
- ASP.NET 웹폼에서 Web API 사용하기 2013-06-25 20:30
- ASP.NET Web API와 라우팅 2013-07-10 20:30
- ASP.NET Web API 도움말 페이지 작성하기 2013-08-14 15:43
- .NET 클라이언트에서 Web API 호출하기 (C#) 2013-08-21 16:26
- WPF 응용 프로그램에서 Web API 호출하기 (C#) 2013-08-28 22:41
- HttpClient 메시지 처리기 2013-09-04 17:16
- ASP.NET Web API 예외 처리 2013-09-11 21:23
- HTML 폼 데이터 전송하기 - 파트 1 2013-09-18 21:23
- HTML 폼 데이터 전송하기 - 파트 2 2013-09-25 01:11
- ASP.NET Web API와 HTTP 쿠키 2013-10-02 09:00
- 자체-호스트(Self-Host) Web API (C#) 2013-10-09 15:59
- OWIN을 이용한 ASP.NET Web API 자체 호스트(Self-Host) 2014-01-17 08:00
- 보안: ASP.NET Web API의 인증(Authentication)과 권한(Authorization) 2014-01-20 08:00
- 보안: 기본 인증 2014-01-22 08:00
- 보안: ASP.NET Web API와 개별 사용자 계정 2014-01-24 08:00
- 보안: 폼 인증 2014-01-27 08:00
- 보안: 통합 Windows 인증 2014-01-29 08:00
- 보안: 크로스 사이트 요청 위조(Cross-Site Request Forgery) 공격 방지하기 2014-02-03 08:00
- 보안: Web API에서 SSL 사용하기 2014-02-05 08:00
- 보안: 외부 인증 서비스 (C#) 2014-02-07 08:00
- 보안: ASP.NET Web API 교차-원본 요청(Cross-Origin Request) 활성화하기 2014-02-10 08:00