다음을 통해 공유


ASP.NET Web API HttpClient 메시지 처리기

메시지 처리기는 HTTP 요청을 수신하고 HTTP 응답을 반환하는 클래스입니다.

일반적으로 일련의 메시지 처리기가 함께 연결됩니다. 첫 번째 처리기는 HTTP 요청을 수신하고 일부 처리를 수행하며 다음 처리기에 요청을 제공합니다. 어떤 시점에서 응답이 만들어지고 체인을 백업합니다. 이 패턴을 위임 처리기라고 합니다 .

H T T P 요청을 수신하고 H T T P 응답을 반환하는 프로세스를 보여 주는 함께 연결된 메시지 처리기의 다이어그램

클라이언트 쪽에서 HttpClient 클래스는 메시지 처리기를 사용하여 요청을 처리합니다. 기본 처리기는 네트워크를 통해 요청을 보내고 서버에서 응답을 가져오는 HttpClientHandler입니다. 클라이언트 파이프라인에 사용자 지정 메시지 처리기를 삽입할 수 있습니다.

클라이언트 파이프라인에 사용자 지정 메시지 처리기를 삽입하는 프로세스 다이어그램 메시지 처리기를 사용하여 요청을 처리하는 h t t p 클라이언트 클래스를 표시합니다.

참고

ASP.NET Web API 서버 쪽에서도 메시지 처리기를 사용합니다. 자세한 내용은 HTTP 메시지 처리기를 참조하세요.

사용자 지정 메시지 처리기

사용자 지정 메시지 처리기를 작성하려면 System.Net.Http.DelegatingHandler 에서 파생되고 SendAsync 메서드를 재정의합니다. 메서드 서명은 다음과 같습니다.

Task<HttpResponseMessage> SendAsync(
    HttpRequestMessage request, CancellationToken cancellationToken);

메서드는 HttpRequestMessage 를 입력으로 사용하고 HttpResponseMessage를 비동기적으로 반환합니다. 일반적인 구현은 다음을 수행합니다.

  1. 요청 메시지를 처리합니다.
  2. 를 호출 base.SendAsync 하여 내부 처리기에 요청을 보냅니다.
  3. 내부 처리기는 응답 메시지를 반환합니다. (이 단계는 비동기입니다.)
  4. 응답을 처리하고 호출자에게 반환합니다.

다음 예제에서는 나가는 요청에 사용자 지정 헤더를 추가하는 메시지 처리기를 보여줍니다.

class MessageHandler1 : DelegatingHandler
{
    private int _count = 0;

    protected override Task<HttpResponseMessage> SendAsync(
        HttpRequestMessage request, System.Threading.CancellationToken cancellationToken)
    {
        System.Threading.Interlocked.Increment(ref _count);
        request.Headers.Add("X-Custom-Header", _count.ToString());
        return base.SendAsync(request, cancellationToken);
    }
}

base.SendAsync에 대한 호출은 비동기입니다. 이 호출 후에 처리기가 작업을 수행하는 경우 await 키워드(keyword) 사용하여 메서드가 완료된 후 실행을 다시 시작합니다. 다음 예제에서는 오류 코드를 기록하는 처리기를 보여 줍니다. 로깅 자체는 그리 흥미롭지 않지만 이 예제에서는 처리기 내의 응답을 가져오는 방법을 보여줍니다.

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 메서드에 전달하는 순서대로 호출됩니다. 처리기는 중첩되므로 응답 메시지가 다른 방향으로 이동합니다. 즉, 마지막 처리기는 응답 메시지를 가져오는 첫 번째 처리기입니다.