ในตัวจัดการข้อความ ชุดของตัวจัดการข้อความจะถูกเชื่อมโยงเข้าด้วยกัน ตัวจัดการแรกได้รับการร้องขอ HTTP ทำการประมวลผลบางอย่าง และให้การร้องขอไปยังตัวจัดการถัดไป เมื่อถึงจุดหนึ่ง การตอบสนองจะถูกสร้างขึ้นและย้อนกลับไปยังห่วงโซ่ รูปแบบนี้เรียกว่า ตัวจัดการการมอบสิทธิ์ .
นอกจากตัวจัดการข้อความฝั่งเซิร์ฟเวอร์ในตัวแล้ว เรายังสามารถสร้างตัวจัดการข้อความ HTTP ฝั่งเซิร์ฟเวอร์ของเราเองได้อีกด้วย เพื่อสร้างตัวจัดการ HTTPMessage ฝั่งเซิร์ฟเวอร์ที่กำหนดเอง ใน ASP.NET Web API เราใช้ประโยชน์จาก DelegatingHandler . เราต้องสร้างคลาสที่ได้มาจาก System.Net.Http.DelegatingHandler . คลาสที่กำหนดเองนั้นควรแทนที่ SendAsync วิธีการ
งาน
เมธอดนี้ใช้ 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; } }