RequestDelegate in Middleware

ASP.NET Core में प्रत्येक मिडिलवेयर क्लास अपने भीतर RequestDelegate का उपयोग करती है। यह ASP.NET Core के रिक्वेस्ट प्रोसेसिंग पाइपलाइन का एक मूलभूत हिस्सा है।

आइए इसे विस्तार से समझते हैं कि 

RequestDelegate क्या है?

RequestDelegate एक C# delegate (प्रतिनिधि) है जो एक HTTP रिक्वेस्ट को प्रोसेस करने के लिए एक फ़ंक्शन हस्ताक्षर को परिभाषित करता है। संक्षेप में, यह एक ऐसा फ़ंक्शन है जो एक HttpContext ऑब्जेक्ट को इनपुट के रूप में लेता है और एक Task (आमतौर पर एक अतुल्यकालिक ऑपरेशन) देता है।

इसका method signature कुछ इस तरह दिखता है:

public delegate Task RequestDelegate(HttpContext context);

मुख्य बातें:

HttpContext context: यह वह ऑब्जेक्ट है जिसमें वर्तमान HTTP रिक्वेस्ट और रिस्पॉन्स से संबंधित सभी जानकारी होती है। मिडिलवेयर इस ऑब्जेक्ट के माध्यम से रिक्वेस्ट (हेडर, बॉडी, क्वेरी पैरामीटर आदि) को पढ़ और संशोधित कर सकता है और रिस्पॉन्स (स्थिति कोड, हेडर, बॉडी आदि) लिख सकता है।

Task: चूंकि ASP.NET Core एक अतुल्यकालिक (asynchronous) फ्रेमवर्क है, इसलिए RequestDelegate एक Task देता है, जो इंगित करता है कि ऑपरेशन कब पूरा हो गया है।

RequestDelegate का उपयोग कैसे किया जाता है?

RequestDelegate का उपयोग ASP.NET Core में रिक्वेस्ट पाइपलाइन बनाने के लिए किया जाता है। प्रत्येक मिडिलवेयर घटक अनिवार्य रूप से एक RequestDelegate है या उसमें एक RequestDelegate शामिल होता है जो अगले मिडिलवेयर को कॉल करने के लिए जिम्मेदार होता है।

ASP.NET Core में मिडिलवेयर को कॉन्फ़िगर करने के तीन मुख्य तरीके हैं, और सभी में RequestDelegate की अवधारणा शामिल है:

1. इनलाइन मिडिलवेयर (app.Use, app.Run)

आप Program.cs में सीधे लैम्ब्डा एक्सप्रेशंस का उपयोग करके इनलाइन मिडिलवेयर को परिभाषित कर सकते हैं। इन मामलों में, लैम्ब्डा एक्सप्रेशन खुद ही एक RequestDelegate के रूप में कार्य करता है।

  • app.Use(async (context, next) => { ... await next(); ... });: यहाँ, next पैरामीटर खुद एक RequestDelegate है जो पाइपलाइन में अगले मिडिलवेयर को संदर्भित करता है।
  • app.Run(async context => { ... });: app.Run एक "टर्मिनल" मिडिलवेयर जोड़ता है जो पाइपलाइन को शॉर्ट-सर्किट कर देता है (यानी, यह next को कॉल नहीं करता है)। यह भी एक RequestDelegate ही लेता है।

2. मिडिलवेयर क्लासेस (Convention-based या IMiddleware)

जब आप एक reusable मिडिलवेयर क्लास बनाते हैं, तो यह आमतौर पर अपने कंस्ट्रक्टर में एक RequestDelegate लेता है (जिसे अक्सर _next नाम दिया जाता है) और अपने InvokeAsync (या Invoke) मेथड में उसे कॉल करता है।

public class CustomMiddleware
{
    private readonly RequestDelegate _next;
 
    public CustomMiddleware(RequestDelegate next)
    {
        _next = next;
    }
 
    public async Task InvokeAsync(HttpContext context)
    {
        // कुछ काम करें
        await _next(context); // पाइपलाइन में अगले मिडिलवेयर को कॉल करें
        // कुछ और काम करें
    }
}

3. IMiddleware इंटरफ़ेस का उपयोग करते हुए

public class StrongyTypedMiddleware : IMiddleware
{
    public async Task InvokeAsync(HttpContext context, RequestDelegate next)
    {
        // कुछ काम करें
        await next(context); // पाइपलाइन में अगले मिडिलवेयर को कॉल करें
        // कुछ और काम करें
    }
}

निष्कर्ष

यह सच है कि प्रत्येक मिडिलवेयर क्लास या इनलाइन मिडिलवेयर RequestDelegate का उपयोग करता है या RequestDelegate के रूप में कार्य करता है। RequestDelegate वह गोंद है जो ASP.NET Core की रिक्वेस्ट प्रोसेसिंग पाइपलाइन को एक साथ रखता है, जिससे प्रत्येक मिडिलवेयर कंपोनेंट रिक्वेस्ट को प्रोसेस कर सकता है और फिर इसे पाइपलाइन में अगले कंपोनेंट तक पहुंचा सकता है (या इसे शॉर्ट-सर्किट कर सकता है)। यह ASP.NET Core में मॉड्यूलर और एक्सटेंसिबल रिक्वेस्ट हैंडलिंग के लिए आधार प्रदान करता है।

 

टिप्पणियाँ

इस ब्लॉग से लोकप्रिय पोस्ट

Differences between in-process and out-of-process hosting models

Web Fundamental Concepts in Hindi for Beginners - FAQs with their Answers Part-1

Introduction to ASP.NET Core and Web Frameworks