संदेश

अप्रैल, 2026 की पोस्ट दिखाई जा रही हैं

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 देता...

How to Use Dependency Injection (DI) with Abstract Classes in ASP.NET Core

यदि इंटरफेस की जगह एब्स्ट्रेक्ट क्लास को इंप्लीमेंट करके यदि कोई क्लास बनता है तो इस स्थिति में डिपेंडेंसी इंजेक्शन और डिपेंडेंसी की रजिस्ट्रेशन को इस पोस्ट में समझते हैं। ASP.NET Core में डिपेंडेंसी इंजेक्शन (DI) को एब्स्ट्रेक्ट क्लास (Abstract Class) के साथ कैसे उपयोग किया जाता है, इसे एक उदाहरण के साथ समझते हैं। संकल्पना (Concept) डिपेंडेंसी इंजेक्शन कंटेनर (DI Container) को इंटरफ़ेस (Interface) के बजाय एब्स्ट्रेक्ट क्लास को भी हल करने के लिए कॉन्फ़िगर किया जा सकता है। सिद्धांत वही रहता है: एक उच्च-स्तरीय क्लास (जैसे CustomerService) एक निम्न-स्तरीय क्लास (जैसे CustomerRepository) पर निर्भर करती है, लेकिन सीधे उसके कंक्रीट इम्प्लीमेंटेशन पर नहीं, बल्कि उसके एब्स्ट्रेक्ट बेस क्लास पर निर्भर करती है। मुख्य अंतर यह है कि: इंटरफ़ेस केवल एक कॉन्ट्रैक्ट (अनुबंध) को परिभाषित करता है, जबकि एब्स्ट्रेक्ट क्लास कॉन्ट्रैक्ट को परिभाषित करने के साथ-साथ कुछ डिफ़ॉल्ट इम्प्लीमेंटेशन या साझा लॉजिक भी प्रदान कर सकता है। एब्स्ट्रेक्ट क्लास का सीधे इंस्टेंस नहीं बनाया जा सकता है; इसे हमेशा एक कंक्री...

Understanding Dependency Injection in ASP.NET Core

इस पोस्ट में ASP.NET Core में डिपेंडेंसी इंजेक्शन (Dependency Injection) को समझते हैं। ASP.NET Core में, जब क्लास A को क्लास B के ऑब्जेक्ट की आवश्यकता होती है, तो हम कहते हैं कि क्लास A की क्लास B पर निर्भरता (Dependency) है। यदि क्लास A सीधे new ऑपरेटर का उपयोग करके क्लास B का ऑब्जेक्ट बनाता है, तो यह टाइट कपलिंग (Tight Coupling) कहलाता है। टाइट कपलिंग एक अच्छी प्रैक्टिस नहीं मानी जाती है क्योंकि यह कोड को कम लचीला और टेस्ट करने में मुश्किल बना देती है। इस समस्या से बचने के लिए, क्लास A अपने भीतर क्लास B के ऑब्जेक्ट को बनाने की जिम्मेदारी किसी और क्लास को दे देता है। जब क्लास A को क्लास B के ऑब्जेक्ट की आवश्यकता होती है, तो यह Dependency ऑब्जेक्ट बाहर से इंजेक्ट (Inject) किया जाता है। इसी प्रक्रिया को डिपेंडेंसी इंजेक्शन (Dependency Injection - DI) के रूप में जाना जाता है। सरल शब्दों में, डिपेंडेंसी इंजेक्शन एक डिज़ाइन पैटर्न है जो आपको क्लासों के बीच की निर्भरताओं को ढीला करने (Decouple) में मदद करता है।  डिपेंडेंसी इंजेक्शन के मुख्य प्रकार डिपेंडेंसी इंजेक्शन मुख्य रूप से ...

An Analysis of Dependency Injection (DI) Containers

डिपेंडेंसी इंजेक्शन (DI) कंटेनर की विवेचना ASP.NET Core में डिपेंडेंसी इंजेक्शन कंटेनर (जिसे IoC कंटेनर - Inversion of Control Container भी कहा जाता है) एक रनटाइम कंपोनेंट है जो सर्विसेज़ के लाइफसाइकिल को मैनेज करता है और उनके बीच की डिपेंडेंसी को संभालता है। यह कैसे काम करता है: 1. सर्विस रजिस्ट्रेशन: आप कंटेनर को बताते हैं कि "जब भी आपको IMyService की आवश्यकता हो, तो MyServiceImplementation का उपयोग करें।" 2. डिपेंडेंसी रिजॉल्यूशन: जब एक क्लास (जैसे एक कंट्रोलर) को अपने कंस्ट्रक्टर में IMyService की आवश्यकता होती है, तो कंटेनर यह पहचानता है कि उसे IMyService की आवश्यकता है। यह तब MyServiceImplementation का एक इंस्टेंस बनाता है (या पुनः उपयोग करता है, लाइफटाइम के आधार पर) और उसे कंट्रोलर के कंस्ट्रक्टर में पास करता है। 3. लाइफसाइकिल प्रबंधन: कंटेनर सर्विस के लाइफटाइम (सिंगलटन, स्कोप, ट्रांजिएंट) को ट्रैक करता है और यह सुनिश्चित करता है कि उन्हें सही समय पर बनाया और डिस्पोज किया जाए। DI कंटेनर का उपयोग करने के मुख्य लाभ हैं: 1. लूज कपलिंग (Loose Coupling): कंपोनेंट्स एक-दूस...

Service Registration with Lifetime in an ASP.NET Core Application

इस पोस्ट में ASP.NET Core एप्लीकेशन के अंतर्गत सर्विस रजिस्ट्रेशन की प्रक्रिया को समझेंगे।   ASP.NET Core एप्लीकेशन में सर्विस रजिस्ट्रेशन (Service Registration) एक मूलभूत अवधारणा है, जो डिपेंडेंसी इंजेक्शन (Dependency Injection - DI) पैटर्न का दिल है। यह एप्लीकेशन के विभिन्न घटकों (कंपोनेंट्स) को एक-दूसरे पर कम निर्भर (loosely coupled) रखने और कोड को अधिक मॉड्यूलर, टेस्टेबल और मैनेजेबल बनाने में मदद करता है।  सर्विस रजिस्ट्रेशन की प्रक्रिया सर्विस रजिस्ट्रेशन का मतलब है कि आप ASP.NET Core के डिपेंडेंसी इंजेक्शन (DI) कंटेनर को बताते हैं कि जब किसी विशिष्ट इंटरफ़ेस या क्लास की आवश्यकता हो, तो उसे कौन सी कंक्रीट इम्प्लीमेंटेशन प्रदान करनी है। यह आमतौर पर एप्लीकेशन के स्टार्टअप के दौरान किया जाता है, .NET 6+ में Program.cs फाइल में।  प्रक्रिया को समझने के लिए इन चरणों को देखें:  सर्विसेज की पहचान: सबसे पहले, आप उन कंपोनेंट्स की पहचान करते हैं जिन्हें DI के माध्यम से इंजेक्ट करने की आवश्यकता होगी। ये अक्सर इंटरफेस और उनकी कंक्रीट क्लास इम्प्लीमेंटेशन होती हैं। ...

CreateBuilder Vs CreateSlimBuilder in ASP.NET Core

ASP.NET Core में CreateBuilder के निम्नलिखित तीन प्रकार के मेथड ओवरलोडिंग है  CreateBuilder(),  CreateBuilder(string[] args),  CreateBuilder(WebApplicationOptions options)  इसके अलावा इन्हीं से मिलता जुलता तीन और ओवरलोडेड मेथड है:  CreateSlimBuilder(),  CreateSlimBuilder(string[] args),  CreateSlimBuilder(WebApplicationOptions options)  .NET 8 (और कुछ हद तक .NET 7) में CreateSlimBuilder() मेथड्स का एक नया सेट पेश किया गया है, जो CreateBuilder() के समकक्ष हैं लेकिन एक अधिक "पतले" (slim) या न्यूनतम कॉन्फ़िगरेशन के साथ आते हैं। तो, अब कुल छह सामान्य रूप से उपयोग किए जाने वाले WebApplicationBuilder क्रिएशन मेथड्स हैं।   Six Builders  1. WebApplication.CreateBuilder()  मेथड्स ये वो मेथड्स हैं जिनके बारे में हमने पहले बात की थी। ये एक "पूर्ण" या मानक WebApplicationBuilder बनाते हैं जिसमें Kestrel, appsettings.json, एनवायरनमेंट वेरिएबल्स, कंसोल लॉगिंग और डिपेंडेंसी इंजेक्शन जैसी सभी डिफ़ॉल्ट ASP.NET Core सेटिंग्स शामिल होती हैं। ये अध...

WebApplication.CreateBuilder() methods

.NET 6 और उसके बाद के versions में प्रयोग किए जाने वाले WebApplication.CreateBuilder() methods के विभिन्न प्रकार के overloaded versions के बारे में इस पोस्ट में समझेंगे।   .NET 6 और उसके बाद के संस्करणों में WebApplication.CreateBuilder() मेथड्स के ओवरलोडेड वर्जन्स का उपयोग किया गया हैं। .NET 6 और उसके बाद के संस्करणों में, WebApplication.CreateBuilder() एक महत्वपूर्ण स्टैटिक मेथड है जो WebApplicationBuilder का एक इंस्टेंस बनाने के लिए उपयोग किया जाता है।  इसका प्राथमिक उद्देश्य ASP.NET Core एप्लीकेशन के लिए एक डिफ़ॉल्ट होस्ट कॉन्फ़िगर करना है, जिसमें Kestrel सर्वर, कॉन्फ़िगरेशन सिस्टम, लॉगिंग और डिपेंडेंसी इंजेक्शन शामिल हैं।  मुख्य WebApplication.CreateBuilder() ओवरलोड  A. WebApplication.CreateBuilder(string[] args)  यह सबसे आम और लगभग सार्वभौमिक रूप से उपयोग किया जाने वाला ओवरलोड है।  पैरामीटर: args (एक string[] जो कमांड-लाइन आर्ग्यूमेंट्स का प्रतिनिधित्व करता है).  कार्यक्षमता: यह एक WebApplicationBuilder इंस्टेंस बनाता है और कमांड-लाइन आर्ग्...

WebApplicationBuilder class in ASP.NET Core

मैं इस पोस्ट में .NET 6 और उसके बाद के संस्करणों में उपयोग किए जाने वाले WebApplicationBuilder क्लास के बारे में विस्तार से बताता हूँ.  WebApplicationBuilder क्लास एक गेम-चेंजर .NET 6 के साथ, Microsoft ने ASP.NET Core एप्लीकेशन बनाने के तरीके में एक महत्वपूर्ण बदलाव पेश किया, जिसे "मिनिमल API" के नाम से जाना जाता है. इस बदलाव का केंद्र बिंदु WebApplicationBuilder क्लास है. WebApplicationBuilder क्लास का मुख्य उद्देश्य  ASP.NET Core एप्लीकेशन को कॉन्फ़िगर और बूटस्ट्रैप करने की प्रक्रिया को सरल और अधिक संक्षिप्त (simpler and more concise) बनाना है. यह पुराने .NET 5 और उससे पहले के संस्करणों में उपयोग किए जाने वाले Startup.cs फ़ाइल और IHostBuilder / IWebHostBuilder के पैटर्न को काफी हद तक बदल देता है.  मुख्य विशेषताएं और भूमिका 1. सिंगल-फाइल अनुभव (Program.cs)  2. होस्ट, कॉन्फ़िगरेशन और लॉगिंग का एकीकरण  3. बिल्ट-इन डिफॉल्ट्स  4. WebApplication इंस्टेंस का निर्माण सिंगल-फाइल अनुभव  (Program.cs): WebApplicationBuilder का उपयोग करके, आप अपनी अधिकांश एप्लीके...

What happens when ASP.NET Core starts

जब ASP.NET Core एप्लीकेशन शुरू होता है, तो Main मेथड ही एंट्री पॉइंट होता है, बिल्कुल किसी भी C# कंसोल एप्लीकेशन की तरह. हालांकि, Main मेथड सीधे तौर पर वेब सर्वर को स्टार्ट नहीं करता. इसके बजाय, यह कुछ महत्वपूर्ण काम करता है जो एप्लीकेशन को चलने लायक बनाते हैं. Main मेथड के बाद का फ्लो CreateBuilder या CreateHostBuilder कॉल Main मेथड के अंदर, आपको आमतौर पर Host.CreateApplicationBuilder() (ASP.NET Core 6.0 और बाद में) या Host.CreateHostBuilder() (पुराने वर्जन में) का कॉल मिलेगा. यह एक होस्ट बिल्डर ऑब्जेक्ट बनाता है. यह बिल्डर एप्लीकेशन के लिए कोर कॉन्फ़िगरेशन को सेट करने में मदद करता है. इसमें लॉगिंग, कॉन्फ़िगरेशन प्रोवाइडर्स, डिपेंडेंसी इंजेक्शन, और Kestrel (जो डिफ़ॉल्ट वेब सर्वर है) जैसे सर्विसेज़ शामिल होते हैं. सर्विसेज़ और कॉन्फ़िगरेशन का रजिस्ट्रेशन होस्ट बिल्डर बनाने के बाद, इसमें सर्विसेज़ (जैसे MVC, Entity Framework, ऑथेंटिकेशन, आदि) और कॉन्फ़िगरेशन को रजिस्टर किया जाता है. यह काम एक्सटेंशन मेथड्स जैसे कि AddControllersWithViews(), AddDbContext(), AddAuthentication(), Configure...

How to start an ASP.NET Core application on a specific port

ASP.NET Core एप्लीकेशन को किसी खास port पर स्टार्ट करने के लिए एप्लीकेशन को किस प्रकार कॉन्फ़िगर करना होगा?  ASP.NET Core एप्लीकेशन को किसी खास पोर्ट पर स्टार्ट करने के लिए, आप कई तरीके से कॉन्फ़िगरेशन कर सकते हैं. इसमें से कुछ सामान्य तरीके निम्न हैं.  1. launchSettings.json फ़ाइल (डेवलपमेंट के लिए)  2. appsettings.json फ़ाइल (कॉन्फ़िगरेशन के ज़रिए)  3. कमांड-लाइन आर्ग्यूमेंट्स (--urls)  4. एनवायरनमेंट वेरिएबल (ASPNETCORE_URLS)  5. प्रोग्रामेटिक कॉन्फ़िगरेशन (Program.cs)  ASP.NET Core एप्लीकेशन को किसी खास पोर्ट पर स्टार्ट करने के लिए कई तरीके हैं, जो आपकी ज़रूरतों और डिप्लॉयमेंट एनवायरनमेंट पर निर्भर करते हैं. यहाँ कुछ सबसे आम और प्रभावी तरीके दिए गए हैं: 1. launchSettings.json फ़ाइल (डेवलपमेंट के लिए) जब आप Visual Studio का उपयोग करके एक नया ASP.NET Core प्रोजेक्ट बनाते हैं, तो Properties फ़ोल्डर में एक launchSettings.json फ़ाइल डिफ़ॉल्ट रूप से जेनरेट होती है. यह फ़ाइल डेवलपमेंट के दौरान एप्लीकेशन को कैसे लॉन्च किया जाए, इसकी सेटिंग्स को नियंत्रित...

Difference between Encoding and Encryption

एन्क्रिप्शन और एन्कोडिंग में क्या अंतर है?  एन्क्रिप्शन (Encryption) और एन्कोडिंग (Encoding) दोनों डेटा को बदलने के तरीके हैं, लेकिन इनका उद्देश्य और काम करने का तरीका बिल्कुल अलग है। सरल शब्दों में कहें तो एन्कोडिंग डेटा को "पढ़ने लायक" बनाने के लिए है, जबकि एन्क्रिप्शन डेटा को "गुप्त" रखने के लिए है।  यहाँ इनके बीच के मुख्य अंतर दिए गए हैं: 1. एन्कोडिंग (Encoding) एन्कोडिंग का मुख्य उद्देश्य डेटा के फॉर्मेट को बदलना है ताकि उसे अलग-अलग सिस्टम या डिवाइस (जैसे ईमेल, ब्राउज़र) द्वारा आसानी से समझा और उपयोग किया जा सके। उद्देश्य: डेटा को सुरक्षित करना नहीं, बल्कि उसे सुलभ (Usable) बनाना। गोपनीयता: इसमें कोई गोपनीयता नहीं होती। इसे कोई भी आसानी से वापस डिकोड कर सकता है। चाबी (Key): इसमें किसी 'Key' की जरूरत नहीं होती। बस एल्गोरिदम पता होना चाहिए। उदाहरण: ASCII, Base64 (अक्सर इमेज डेटा को टेक्स्ट में बदलने के लिए उपयोग होता है), URL Encoding। 2. एन्क्रिप्शन (Encryption) एन्क्रिप्शन का मुख्य उद्देश्य डेटा को सुरक्षित और गोपनीय रखना है ताकि अनधिकृत व्यक्ति...

HTTP Basic Authentication in ASP.NET Core Razor Pages

पिछ्ला सम्बन्धित लेख  HTTP Basic Authentication फ्लो ASP.NET Core Razor Pages एप्लीकेशन बनाए जिसका नाम BasicAuthDemo है। प्रोजेक्ट file इस प्रकार है: <Project Sdk="Microsoft.NET.Sdk.Web"> <PropertyGroup> <TargetFramework>net8.0</TargetFramework> <Nullable>enable</Nullable> <ImplicitUsings>enable</ImplicitUsings> </PropertyGroup> </Project> HTTP Basic Authentication को हैंडल करने के लिए निम्न BasicAuthenticationHandler क्लास file बनाए।  ध्यान दीजिए की सरलता के लिए यूजरनाम और पासवर्ड हार्ड कोडेड है। वास्तव में इसे किसी डेटाबेस में रखना चाहिए।   using Microsoft.AspNetCore.Authentication; using Microsoft.Extensions.Options; using System.Net.Http.Headers; using System.Security.Claims; using System.Text; using System.Text.Encodings.Web; namespace BasicAuthDemo { public class BasicAuthenticationHandler : AuthenticationHandler<AuthenticationSchemeOptions> { public B...