Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C#

การใช้ DelegatingHandler ใน Asp.Net webAPI C # คืออะไร


ในตัวจัดการข้อความ ชุดของตัวจัดการข้อความจะถูกเชื่อมโยงเข้าด้วยกัน ตัวจัดการแรกได้รับการร้องขอ HTTP ทำการประมวลผลบางอย่าง และให้การร้องขอไปยังตัวจัดการถัดไป เมื่อถึงจุดหนึ่ง การตอบสนองจะถูกสร้างขึ้นและย้อนกลับไปยังห่วงโซ่ รูปแบบนี้เรียกว่า ตัวจัดการการมอบสิทธิ์ .

นอกจากตัวจัดการข้อความฝั่งเซิร์ฟเวอร์ในตัวแล้ว เรายังสามารถสร้างตัวจัดการข้อความ HTTP ฝั่งเซิร์ฟเวอร์ของเราเองได้อีกด้วย เพื่อสร้างตัวจัดการ HTTPMessage ฝั่งเซิร์ฟเวอร์ที่กำหนดเอง ใน ASP.NET Web API เราใช้ประโยชน์จาก DelegatingHandler . เราต้องสร้างคลาสที่ได้มาจาก System.Net.Http.DelegatingHandler . คลาสที่กำหนดเองนั้นควรแทนที่ SendAsync วิธีการ

งาน SendAsync(คำขอ HttpRequestMessage,CancellationToken cancelToken);

เมธอดนี้ใช้ HttpRequestMessage เป็นอินพุตและส่งกลับ anHttpResponseMessage แบบอะซิงโครนัส การใช้งานทั่วไปทำสิ่งต่อไปนี้ -

  • ประมวลผลข้อความขอ
  • โทร 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;
   }
}