2015-11-16 9 views
8

में प्रति-अनुरोध स्थिर डेटा मैं सिग्नल अनुरोध के जीवनकाल के लिए उपयोगकर्ता जानकारी को स्थिर रूप से संग्रहीत करना चाहता हूं। मैंने HAPpContext.Current.Items का उपयोग करके WebAPI में ऐसा किया है लेकिन यह सिग्नल में मौजूद नहीं है।सिग्नल

मुझे पता है कि थ्रेडस्टैटिक काम नहीं करेगा क्योंकि एकाधिक अनुरोधों के बीच सिग्नलआर थ्रेड साझा किया जा सकता है।

संदर्भ के लिए मैं आईआईएस के भीतर यह होस्टिंग और इस सवाल का जवाब देने के लिए बहुत देर हो चुकी SignalR (2.2.0)

+0

इसके लिए अधिकांश समाधानों में एक और अधिक लगातार कक्षा या एक चुटकी में एक शब्दकोश शामिल है। क्या आपने 'डिक्शनरी <स्ट्रिंग, SomeCoolObject>' की कोशिश की है, जो कनेक्शन को ट्रैक करना चाहते हैं, उसके लिए कनेक्शन आईडी मैपिंग? 'ऑनकनेक्ट' में लोगों को जोड़ें, उन्हें 'ऑनडिस्कनेक्ट' में हटा दें। –

उत्तर

0

के नवीनतम संस्करण को यह निश्चित रूप है का उपयोग करते हुए और हो सकता है आप पहले से ही इस के लिए कुछ पता लगा है कर रहा हूँ। यह सिर्फ इस समस्या पर अपना विचार साझा करने का प्रयास है।

तो आरंभ करने के लिए, आप सिग्नलआर के लिए प्रमाणीकरण सक्षम कर सकते हैं, और फिर आप अपने हब विधियों में Context.User.xxx का उपयोग कर सकते हैं।

authentication for all hubs को सक्षम करने के लिए आप कुछ इस तरह कर सकते हैं:

public partial class Startup { 
    public void Configuration(IAppBuilder app) { 
     app.MapSignalR(); 
     GlobalHost.HubPipeline.RequireAuthentication(); 
    } 
} 

एक बार जब आप यह है कि आप अब भी अपने सामान्य प्रमाणीकरण पाइप लाइन का उपयोग कर सकते आपके अनुरोध को प्रमाणित करने के, और उन जानकारी Context.User संपत्ति के माध्यम से Hub तरीकों की आपूर्ति की जाएगी करना । नीचे here से एक उदाहरण है।

public async Task JoinRoom(string roomName) 
{ 
    await Groups.Add(Context.ConnectionId, roomName); 
    Clients.Group(roomName).addChatMessage(Context.User.Identity.Name + " joined."); 
} 
ऐसे Redis कैश या कुछ इसी तरह के रूप में इस आप एक बाहर के स्मृति भंडारण में प्रति-उपयोगकर्ता डेटा बनाए रख सकते हैं (इतना है कि यह बाहर पैमाने पर कर सकते हैं) के साथ-साथ

या वैकल्पिक दृष्टिकोण के रूप में, आप HubPipelineModule भी बढ़ा सकते हैं, और घटनाओं पर अधिक बारीक नियंत्रण रखने के लिए custom one बना सकते हैं।

public class LoggingPipelineModule : HubPipelineModule 
{ 
    protected override bool OnBeforeIncoming(IHubIncomingInvokerContext context) 
    { 
     return base.OnBeforeIncoming(context); 
    } 
    protected override bool OnBeforeOutgoing(IHubOutgoingInvokerContext context) 
    { 
     return base.OnBeforeOutgoing(context); 
    } 
} 

public void Configuration(IAppBuilder app) 
{ 
    GlobalHost.HubPipeline.AddModule(new LoggingPipelineModule()); 
    app.MapSignalR(); 
} 

उम्मीद है कि इससे मदद मिलती है। यह भी जानना दिलचस्प होगा कि आपने समस्या का सामना कैसे किया है।

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