ASP.NET Web API의 HttpClient 메시지 처리기HttpClient Message Handlers in ASP.NET Web API

Mike Wassonby Mike Wasson

메시지 처리기 는 http 요청을 수신 하 고 http 응답을 반환 하는 클래스입니다.A message handler is a class that receives an HTTP request and returns an HTTP response.

일반적으로 일련의 메시지 처리기가 함께 연결 됩니다.Typically, a series of message handlers are chained together. 첫 번째 처리기는 HTTP 요청을 수신 하 고, 일부 처리를 수행 하 고, 다음 처리기에 요청을 제공 합니다.The first handler receives an HTTP request, does some processing, and gives the request to the next handler. 어느 시점에서 응답이 만들어지고 체인을 백업 합니다.At some point, the response is created and goes back up the chain. 이 패턴을 위임 처리기 라고 합니다.This pattern is called a delegating handler.

클라이언트 쪽에서는 Httpclient 클래스가 메시지 처리기를 사용 하 여 요청을 처리 합니다.On the client side, the HttpClient class uses a message handler to process requests. 기본 처리기는 Httpclienthandler로, 네트워크를 통해 요청을 보내고 서버에서 응답을 가져옵니다.The default handler is HttpClientHandler, which sends the request over the network and gets the response from the server. 사용자 지정 메시지 처리기를 클라이언트 파이프라인에 삽입할 수 있습니다.You can insert custom message handlers into the client pipeline:

Note

또한 ASP.NET Web API 서버 쪽의 메시지 처리기를 사용 합니다.ASP.NET Web API also uses message handlers on the server side. 자세한 내용은 HTTP 메시지 처리기를 참조 하세요.For more information, see HTTP Message Handlers.

사용자 지정 메시지 처리기Custom Message Handlers

사용자 지정 메시지 처리기를 쓰려면 DelegatingHandler 에서 파생 하 고 SendAsync 메서드를 재정의 합니다.To write a custom message handler, derive from System.Net.Http.DelegatingHandler and override the SendAsync method. 메서드 서명은 다음과 같습니다.Here is the method signature:

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

메서드는 HttpRequestMessage 를 입력으로 사용 하 고 HttpResponseMessage를 비동기적으로 반환 합니다.The method takes an HttpRequestMessage as input and asynchronously returns an HttpResponseMessage. 일반적인 구현에서는 다음을 수행 합니다.A typical implementation does the following:

  1. 요청 메시지를 처리 합니다.Process the request message.
  2. base.SendAsync를 호출 하 여 요청을 내부 처리기에 보냅니다.Call base.SendAsync to send the request to the inner handler.
  3. 내부 처리기는 응답 메시지를 반환 합니다.The inner handler returns a response message. 이 단계는 비동기입니다.(This step is asynchronous.)
  4. 응답을 처리 하 고 호출자에 게 반환 합니다.Process the response and return it to the caller.

다음 예제에서는 보내는 요청에 사용자 지정 헤더를 추가 하는 메시지 처리기를 보여 줍니다.The following example shows a message handler that adds a custom header to the outgoing request:

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에 대한 호출은 비동기입니다.The call to base.SendAsync is asynchronous. 이 호출 후 처리기에서 작업을 수행 하는 경우에는 wait 키워드를 사용 하 여 메서드가 완료 된 후 실행을 다시 시작 합니다.If the handler does any work after this call, use the await keyword to resume execution after the method completes. 다음 예제에서는 오류 코드를 기록 하는 처리기를 보여 줍니다.The following example shows a handler that logs error codes. 로깅 자체는 그다지 흥미로운 것은 아니지만이 예제에서는 처리기 내에서 응답을 가져오는 방법을 보여 줍니다.The logging itself is not very interesting, but the example shows how to get at the response inside the handler.

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);
    }
}

클라이언트 파이프라인에 메시지 처리기 추가Adding Message Handlers to the Client Pipeline

Httpclient에 사용자 지정 처리기를 추가 하려면 Httpclientfactory. 만들기 메서드를 사용 합니다.To add custom handlers to HttpClient, use the HttpClientFactory.Create method:

HttpClient client = HttpClientFactory.Create(new Handler1(), new Handler2(), new Handler3());

메시지 처리기는 Create 메서드에 전달 하는 순서 대로 호출 됩니다.Message handlers are called in the order that you pass them into the Create method. 처리기가 중첩 되기 때문에 응답 메시지는 다른 방향으로 이동 합니다.Because handlers are nested, the response message travels in the other direction. 즉, 마지막 처리기가 응답 메시지를 가져오기 위한 첫 번째 처리기입니다.That is, the last handler is the first to get the response message.