2012-09-18 21 views
16

मुझे समझ में आता है कि सिग्नल आपको access to the HttpContext क्यों नहीं देता है। हालांकि, यह हमारे लिए काफी समस्याग्रस्त है। मुझे समझाएं:सिग्नलआर और एचटीपी कोंटेक्स्ट/सत्र

हमारा एप्लिकेशन एक बहु-किरायेदार एप्लिकेशन है जहां उपयोगकर्ता लॉग इन करते समय पर्यावरण चुनता है। यह मूल रूप से HttpSession में कनेक्शनस्ट्रिंग नाम पंजीकृत करता है। हमारे सिग्नलआर हब में, हमें Disconnect पर डेटाबेस तक पहुंचने की आवश्यकता है। लेकिन यह संभव नहीं है क्योंकि हमारे पास इस बिंदु पर कोई HttpContext नहीं है और लिखने के लिए पर्यावरण निर्धारित नहीं कर सकता है।

क्या कोई हमें इस समस्या को हल करने का सुझाव प्रदान कर सकता है? हम इस पर थोड़ा फंस गए हैं।

EDIT: बोनस पॉइंट यदि आपका समाधान लोड-बैलेंस्ड वातावरण में काम करता है।

+0

क्या आप अभी भी यहां समाधान ढूंढ रहे हैं? –

+0

हमने इस सुविधा को पूरी तरह से अलग तरीके से कार्यान्वित किया। – Lodewijk

+1

@Lodewijk, क्या आप अपना अलग तरीका साझा कर सकते हैं? मैं एक ही स्थिति में हूं। –

उत्तर

0

जब आप कनेक्ट करते हैं तो उपयोगकर्ता के कनेक्शन आईडी का ट्रैक रखने के लिए आप किसी शब्दकोश की तरह कुछ उपयोग कर सकते हैं। सत्र राज्य को संग्रहीत करने के लिए SQL सर्वर का उपयोग करने से भी मदद मिल सकती है: http://support.microsoft.com/kb/317604

सिग्नलर आपको उपयोगकर्ता तक पहुंच प्रदान करता है। Identity.Name जिसे आप डिस्कनेक्ट() निकालते समय ट्रैक करने के लिए उपयोग कर सकते हैं।

+0

अफसोस की बात है, उपयोगकर्ता की जानकारी उपलब्ध नहीं है: ".. साथ ही हबकॉन्टेक्स्ट के उपयोगकर्ता और कुकीज़ को पॉप्युलेट नहीं किया जाएगा।" (https://github.com/SignalR/SignalR/wiki/Hubs) – Lodewijk

+0

इसके अलावा, हम लोड-संतुलित वातावरण में हैं, इसलिए डिस्कनेक्ट दूसरे सर्वर पर समाप्त हो सकता है जहां शब्दकोश पॉप्युलेट नहीं होता है। – Lodewijk

+0

मैंने कुछ पिछले कोड और Context.User.Identity.Name को देखा है वर्तमान में लॉग इन उपयोगकर्ता दिखाता है। यदि पर्यावरण संतुलित लोड होता है, तो आपको सिग्नलआर के लिए रेडिस देखना चाहिए। https://github.com/SignalR/SignalR/wiki/SignalR-with-Redis-Running-on-a-Windows-Azure-Virtual-Machine – Steve

0

तथ्य यह है कि लोड लोड पर्यावरण पर काम करने के लिए आपको अपने समाधान की आवश्यकता है इस तथ्य को लागू करता है कि आपको सत्र से अलग कुछ में अपनी कनेक्शन स्ट्रिंग को स्टोर करने की आवश्यकता है। एक कुंजी-मूल्य स्टोर (आप इसे कैसे कार्यान्वित करते हैं इससे कोई फर्क नहीं पड़ता) जहां कुंजी कनेक्शन आईडी (डिस्कनेक्ट पर उपलब्ध एकमात्र जानकारी) है और मान कनेक्शन स्ट्रिंग है। यदि आप चाहें तो आप किसी भी अन्य स्थान पर सत्र का उपयोग जारी रख सकते हैं, लेकिन मुझे लगता है कि आपको कम से कम उस जानकारी के लिए, वहां से लिखने और पढ़ने के लिए पूरे एप्लिकेशन को स्थानांतरित करना चाहिए।

+0

सत्र स्थिति लोड संतुलित वातावरण में कोई समस्या नहीं है, और कम से कम एक दशक तक नहीं रहा है। –

+0

मतदान से पहले प्रश्न बेहतर पढ़ें, HttpContext सिग्नलआर (या कम से कम उस समय नहीं था) के साथ उपलब्ध नहीं है, और उस सत्र के साथ – Wasp

+1

असल में HttpContext और HttpContext.Current दोनों उपलब्ध हैं और यह केवल सत्र है जो शून्य है। – Dave

7

हाय को भी इसी तरह की समस्या थी क्योंकि मुझे अपने आवेदन के लिए सिग्नलआर हब में अपने अनुरोधों को वैयक्तिकृत करने के लिए गैर-प्रमाणीकृत आगंतुकों की पहचान करने की आवश्यकता थी।

मैंने इसे "HttpContext.Current.Request.AnonymousId" तक पहुंचकर हल किया है। SQL डेटाबेस में एक स्व-कार्यान्वित सत्र-इकाई में अस्थायी रिकॉर्ड के लिए AnonymousId मानचित्र - अनिवार्य रूप से डेटाबेस-समर्थित सत्र को अनुकरण करते हैं।

यहाँ मामले में कुछ प्रासंगिक दस्तावेज आप AnonymousId को अनुकूलित, या डेटाबेस से प्रवेश आरंभ करना चाहते हैं: http://msdn.microsoft.com/en-us/library/system.web.httprequest.anonymousid.aspx

इसके अलावा, आप OnDisconnected() इस तरह के संदर्भ उपयोग करने में सक्षम होना चाहिए: Context.Request .GetHttpContext()

मुझे उम्मीद है कि इससे मदद मिलती है।

20

यह एक पुराना सवाल है, लेकिन अगर मैं वहां किसी के लिए सहायक होता हूं तो मैं अपना जवाब छोड़ रहा हूं।

चूंकि आपका केंद्र माइक्रोसॉफ्ट.एस्पनेट। सिग्नलआर बढ़ाता है।

  • ConnectionId
  • हेडर
  • QueryString
  • अनुरोध: हब यह

    यह गुण फोन करने वाले से जानकारी का एक बहुत कुछ को उजागर करता है प्रकार HubCallerContext की प्रसंग संपत्ति की पहुंच है

  • कुकीज़
  • उपयोगकर्ता

मेरी समाधान में मैं अपने कुंजी/मान दुकान (Redis मेरे मामले में) में एक कुंजी के रूप में Context.User.Identity.Nameमें संग्रहीत उपयोगकर्ता नाम का उपयोग सभी का ट्रैक रखने के लिए एक उपयोगकर्ता के कनेक्शन है।

आप उपयोगकर्ता से जुड़े कनेक्शनों की सूची बनाए रखने के लिए OnConnnect और OnDisconnect ओवरराइड कर सकते हैं। आप कनेक्शन आईडी के साथ जो कुछ भी चाहते हैं उसे स्टोर भी कर सकते हैं (आपके उपयोगकर्ता कनेक्शन स्ट्रिंग्स, आपके मामले में)।

+3

दुर्भाग्यवश उपयोगकर्ता नाम पर आधारित कैशिंग काम नहीं करता है यदि उपयोगकर्ता के कई सत्र खुले हैं ... – Dave

+1

क्या आप विस्तृत करना चाहते हैं? –

+0

मुझे यहां भी इसी तरह की समस्या थी: http://stackoverflow.com/questions/27729113/null-exception-on-httpcontext-current-request-cookies-when-firing-signalr- विधि। इस धागे ने मुझे अपने बालों को खींचने से बचाया। मैंने अपनी समस्या तय की है लेकिन मैं वास्तव में समस्या को समझ नहीं पा रहा हूं। यदि कोई भी आगे बढ़ सकता है और मुझे एक ठोस जवाब दे सकता है तो यह बहुत अच्छा होगा! मुझे पूरी तरह समझने के बिना आगे बढ़ने से नफरत है। –

संबंधित मुद्दे