आपकी वेबसाइट अभी भी यूजर से रियल-टाइम में बात क्यों नहीं करती?
\n\nकल्पना करें: आप एक शेयर बाजार टर्मिनल खोलते हैं, और डॉलर की दर अपने आप अपडेट होती है। या आप एडमिन पैनल में जाते हैं — और देखते हैं कि आपकी आंखों के सामने रजिस्टर्ड यूजर्स की संख्या बढ़ रही है। या एक चैट, जहां संदेश बिना बार-बार पेज रिफ्रेश किए आते हैं।
\n\nपहले इसके लिए या तो WebSocket लगाना पड़ता था (जटिल, महंगा, हमेशा जरूरी नहीं), या long polling का उपयोग करना पड़ता था (एक पैच जो फोन की बैटरी खत्म कर देता है)। लेकिन एक तीसरा रास्ता भी है — C# में Server-Sent Events।
\n\nआज हम एक ऐसी तकनीक को समझेंगे जो सर्वर को खुद क्लाइंट से 'संपर्क' करने और डेटा भेजने की अनुमति देती है। बिना अनावश्यक कोड के, बिना टनों JavaScript के, बिना प्रॉक्सी सर्वर के सिरदर्द के। सिर्फ C#, सिर्फ हार्डकोर।
\n\nServer-Sent Events (SSE) क्या है और यह 'गरीबों का प्रोटोकॉल' क्यों नहीं है
\n\nServer-Sent Events (या SSE) एक HTML5 मानक है जो सर्वर को सामान्य HTTP कनेक्शन के माध्यम से क्लाइंट को स्ट्रीमिंग डेटा भेजने की अनुमति देता है। क्लाइंट इवेंट्स को सब्सक्राइब करता है, और सर्वर बस Response.Body में लिखता है। बस इतना ही।
\n\nWebSocket से मुख्य अंतर: SSE एक एकतरफा चैनल है (सर्वर → क्लाइंट)। आपको वापस डेटा भेजने की जरूरत नहीं है? बढ़िया, SSE आपकी पसंद है। इसके साथ:
\n\n- \n
- सामान्य HTTP/1.1 और HTTP/2 पर काम करता है \n
- कनेक्शन टूटने पर ऑटोमैटिकली रीकनेक्ट होता है (ब्राउज़र के
EventSourceमें बिल्ट-इन) \n - क्लाइंट पर किसी अतिरिक्त लाइब्रेरी की जरूरत नहीं (स्टैंडर्ड JavaScript के अलावा) \n
- किसी भी प्रॉक्सी और लोड बैलेंसर से गुजरता है (WebSocket के विपरीत) \n
व्यवहार में, SSE C# का उपयोग इसके लिए किया जाता है:
\n- \n
- नोटिफिकेशन फीड (सीधे ब्राउज़र में पुश नोटिफिकेशन) \n
- सर्वर मॉनिटरिंग (लाइव मेट्रिक्स वाले डैशबोर्ड) \n
- लॉग ट्रांसमिशन (उदाहरण: ब्राउज़र में tail -f) \n
- AI जनरेशन का स्ट्रीमिंग (ChatGPT जैसे मॉडल से धीरे-धीरे आउटपुट) \n
SSE कैसे काम करता है: एक लाइन का प्रोटोकॉल
\n\nसब कुछ सरल है। सर्वर क्लाइंट को एक विशेष फॉर्मेट में टेक्स्ट का स्ट्रीम भेजता है:
\n\ndata: नमस्ते, दुनिया!\\n\\n\ndata: {"message": "JSON भी काम करता है"}\\n\\n\nevent: customEvent\\n\ndata: नाम वाला इवेंट\\n\\n\n\nहर संदेश data: से शुरू होता है, दो न्यूलाइन के साथ खत्म होता है। आप कस्टम इवेंट टाइप के लिए event:, आइडेंटिफायर के लिए id: और रीकनेक्ट टाइमआउट के लिए retry: निर्दिष्ट कर सकते हैं।
क्लाइंट JavaScript में इस तरह सब्सक्राइब करता है:
\n\nconst source = new EventSource("/api/stream");\nsource.onmessage = (event) => {\n console.log("प्राप्त हुआ:", event.data);\n};\nsource.addEventListener("customEvent", (event) => {\n console.log("कस्टम इवेंट:", event.data);\n});\n\nऔर यह सभी आधुनिक ब्राउज़रों में काम करता है। कोई npm पैकेज नहीं, कोई WebSocket पॉलीफिल नहीं।
\n\nC# में Server-Sent Events: ASP.NET Core पर कार्यान्वयन
\n\nचलिए अब कोड लिखते हैं। C# में SSE आयोजित करने का सबसे आसान तरीका ASP.NET Core में एक एंडपॉइंट बनाना है जो रिस्पॉन्स को पूरा नहीं करता, बल्कि उसमें भागों में लिखता है।
\n\nबेसिक SSE एंडपॉइंट
\n\nusing Microsoft.AspNetCore.Mvc;\n\n[ApiController]\n[Route("api")]\npublic class StreamController : ControllerBase\n{\n [HttpGet("stream")]\n public async Task Get(CancellationToken cancellationToken)\n {\n Response.Headers.Append("Content-Type", "text/event-stream");\n Response.Headers.Append("Cache-Control", "no-cache");\n Response.Headers.Append("Connection", "keep-alive");\n\n for (int i = 0; i < 10; i++)\n {\n if (cancellationToken.IsCancellationRequested)\n break;\n\n // SSE फॉर्मेट: data: ... \\n\\n\n await Response.WriteAsync($"data: संदेश #{i}\\n\\n",