Computer >> Máy Tính >  >> Lập trình >> C#

Cách sử dụng DelegateHandler trong Asp.Net webAPI C # là gì?

Trong một trình xử lý thông báo, một loạt các trình xử lý thông báo được liên kết với nhau. Trình xử lý đầu tiên nhận được một yêu cầu HTTP, thực hiện một số xử lý và đưa yêu cầu đến trình xử lý tiếp theo. Tại một số thời điểm, phản hồi được tạo và quay trở lại chuỗi. Mẫu này được gọi là trình xử lý ủy quyền .

Cùng với Trình xử lý thông báo phía máy chủ được tích hợp sẵn, chúng ta cũng có thể tạo Trình xử lý thông báo HTTP phía máy chủ của riêng mình. Để tạo một Trình xử lý HTTPMessage Phía Máy chủ tùy chỉnh trong API Web ASP.NET, chúng tôi sử dụng Trình xử lý ủy quyền . Chúng tôi phải tạo một lớp dẫn xuất từ ​​ System.Net.Http.DeleratingHandler . Sau đó, lớp tùy chỉnh đó sẽ ghi đè SendAsync phương pháp.

Tác vụ SendAsync (yêu cầu HttpRequestMessage, CancelToken hủyToken);

Phương thức này lấy HttpRequestMessage làm đầu vào và trả về anHttpResponseMessage một cách không đồng bộ. Một cách triển khai điển hình thực hiện những điều sau -

  • Xử lý thông báo yêu cầu.
  • Gọi base.SendAsync để gửi yêu cầu đến trình xử lý bên trong.
  • Trình xử lý bên trong trả về một thông báo phản hồi. (Bước này không đồng bộ.)
  • Xử lý câu trả lời và gửi lại cho người gọi.

Ví dụ

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

Một trình xử lý ủy quyền cũng có thể bỏ qua trình xử lý bên trong và trực tiếp tạo phản hồi.

Ví dụ

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