একটি বার্তা হ্যান্ডলারে, বার্তা হ্যান্ডলারের একটি সিরিজ একসাথে শৃঙ্খলিত হয়। প্রথম হ্যান্ডলার একটি HTTP অনুরোধ গ্রহণ করে, কিছু প্রক্রিয়াকরণ করে এবং পরবর্তী হ্যান্ডলারকে অনুরোধটি দেয়। কিছু সময়ে, প্রতিক্রিয়া তৈরি হয় এবং চেইনে ফিরে যায়। এই প্যাটার্নটিকে একটি অর্পণকারী হ্যান্ডলার বলা হয়৷ .
বিল্ট-ইন সার্ভার-সাইড মেসেজ হ্যান্ডলারের পাশাপাশি, আমরা আমাদের নিজস্ব সার্ভার-সাইড HTTP মেসেজ হ্যান্ডলারও তৈরি করতে পারি। একটি কাস্টম সার্ভার-সাইড HTTPMessage হ্যান্ডলার তৈরি করতে ASP.NET Web API-এ, আমরা DelegateHandler ব্যবহার করি . আমাদের 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;
}
}