Computer >> 컴퓨터 >  >> 프로그램 작성 >> C#

Asp.Net webAPI C#에서 DelegatingHandler의 사용법은 무엇입니까?

<시간/>

메시지 처리기에서는 일련의 메시지 처리기가 함께 연결됩니다. 첫 번째 핸들러는 HTTP 요청을 수신하고 일부 처리를 수행하고 요청을 다음 핸들러에 제공합니다. 어느 시점에서 응답이 생성되고 다시 체인으로 이동합니다. 이 패턴을 위임 핸들러라고 합니다. .

내장된 서버 측 메시지 핸들러와 함께 자체 서버 측 HTTP 메시지 핸들러를 생성할 수도 있습니다. 사용자 정의 서버 측 HTTPMessage 핸들러를 생성하려면 ASP.NET Web API에서는 DelegatingHandler를 사용합니다. . System.Net.Http.DelegatingHandler에서 파생된 클래스를 만들어야 합니다. . 그러면 해당 사용자 정의 클래스가 SendAsync를 재정의해야 합니다. 방법.

태스크 SendAsync(HttpRequestMessage 요청,CancellationToken 취소토큰);

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

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

public class CustomMessageHandler : DelegatingHandler{
   protected async override Task<HttpResponseMessage> SendAsync(
   HttpRequestMessage request, CancellationToken cancellationToken){
      Debug.WriteLine("CustomMessageHandler processing the request");
      // Calling the inner handler
      var response = await base.SendAsync(request, cancellationToken);
      Debug.WriteLine("CustomMessageHandler processing the response");
      return response;
   }
}

위임 핸들러는 내부 핸들러를 건너뛰고 직접 응답을 생성할 수도 있습니다.

public class CustomMessageHandler: DelegatingHandler{
   protected override Task<HttpResponseMessage> SendAsync(
   HttpRequestMessage request, CancellationToken cancellationToken){
      // Create the response
      var response = new HttpResponseMessage(HttpStatusCode.OK){
         Content = new StringContent("Skipping the inner handler")
      };
      // TaskCompletionSource creates a task that does not contain a delegate
      var taskCompletion = new TaskCompletionSource<HttpResponseMessage>();
      taskCompletion.SetResult(response);
      return taskCompletion.Task;
   }
}