एक संदेश हैंडलर में, संदेश संचालकों की एक श्रृंखला एक साथ जंजीर में जकड़ी होती है। पहला हैंडलर एक HTTP अनुरोध प्राप्त करता है, कुछ प्रसंस्करण करता है, और अगले हैंडलर को अनुरोध देता है। कुछ बिंदु पर, प्रतिक्रिया बनाई जाती है और श्रृंखला में बैक अप जाती है। इस पैटर्न को प्रतिनिधि हैंडलर . कहा जाता है ।
अंतर्निहित सर्वर-साइड संदेश हैंडलर के साथ, हम अपना सर्वर-साइड HTTP संदेश हैंडलर भी बना सकते हैं। कस्टम सर्वर-साइड HTTPMessage हैंडलर बनाने के लिए ASP.NET वेब API में, हम DelegatingHandler . का उपयोग करते हैं . हमें System.Net.Http.DelegatingHandler . से व्युत्पन्न एक वर्ग बनाना है . तब उस कस्टम वर्ग को SendAsync . को ओवरराइड करना चाहिए विधि।
कार्य
विधि इनपुट के रूप में एक HttpRequestMessage लेती है और अतुल्यकालिक रूप से एक HttpResponseMessage लौटाती है। एक सामान्य कार्यान्वयन निम्न कार्य करता है -
- अनुरोध संदेश संसाधित करें।
- आधार पर कॉल करें। आंतरिक हैंडलर को अनुरोध भेजने के लिए 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; } }