2012-09-15 18 views
12

में वर्तमान केंद्र प्राप्त करना क्या नियंत्रक से सिग्नलआर हब में कॉल करने का कोई अच्छा तरीका है?सिग्नलआर

public class StatsHub : Hub 
{ 
    private static readonly Lazy<StatsHub> instance = new Lazy<StatsHub>(() => new StatsHub()); 
    public static StatsHub Instance { get { return instance.Value; } } 

    public StatsHub() 
    { 
     if (this.Clients == null) 
     { 
      var hubContext = SignalR.GlobalHost.ConnectionManager.GetHubContext<StatsHub>(); 
      this.Clients = hubContext.Clients; 
      this.Groups = hubContext.Groups; 
     } 
    } 

    // methods here... 
} 

तो मेरे नियंत्रक कार्यों में मैं सिर्फ कह सकते हैं, उदाहरण के लिए

StatsHub.Instance.SendMessage("blah"); 

और यह लगभग अच्छा है, सिवाय इसके कि hubContext कॉलर या नहीं है:

अभी मैं इस राशि हब के संदर्भ गुण - जो कि अच्छे हैं।

उम्मीद है कि ऐसा करने का एक बेहतर तरीका है?

उत्तर

14

एक डिफ़ॉल्ट हबमैनेजर मिला, जो मुझे चाहिए, मुझे लगता है।

DefaultHubManager hd = new DefaultHubManager(GlobalHost.DependencyResolver); 
var hub = hd.ResolveHub("AdminHub") as AdminHub; 
hub.SendMessage("woohoo"); 

काम करता है। यदि कोई बेहतर/पसंदीदा तरीका है - कृपया साझा करें।

+5

यह अब और काम नहीं करता है (सिग्नल 2 में?)। Http://stackoverflow.com/questions/17896739/use-hub-methods-from-controller देखें। –

+0

'DefaultHubManager' सिग्नल 2.x में मौजूद है हालांकि' hub.Context' शून्य है, इसलिए सभी ऑपरेशन विफल हो जाते हैं। – Dai

+0

यह सिग्नलआर 2.0 में काम करता है लेकिन मुझे अपवाद मिलता है हबपिपलाइन द्वारा बनाई गई हब इंस्टेंस का उपयोग असमर्थित है – GreyCloud

18

यदि आप हब के बाहर से एक केंद्र पर प्रसारण करना चाहते हैं, तो आपको हब संदर्भ प्राप्त करने के लिए GlobalHost.ConnectionManager.GetHubContext<MyHub>() की आवश्यकता है। फिर आप इस संदर्भ का उपयोग .Clients संपत्ति के माध्यम से प्रसारित करने के लिए कर सकते हैं।

जैसा कि आपके नमूना कोड में इंगित किया गया है, आप पहले ही हब संदर्भ को रोक चुके हैं, लेकिन हब के अंदर ऐसा करने से मेरी राय में सही नहीं लगता है। यदि आप केवल अपने नियंत्रक कार्यों से SendMessage() में तर्क का उपयोग कर रहे हैं, तो मैं कोड को सीधे नियंत्रक क्रिया में ले जाउंगा और वहां से GetHubContext<T>() के माध्यम से प्राप्त हब संदर्भ का उपयोग करूंगा।

कृपया ध्यान दें कि Caller या Context संपत्ति हमेशा इस परिदृश्य में null हो जाएगा, क्योंकि SignalR जब सर्वर के लिए एक अनुरोध कर शामिल नहीं किया गया है और इसलिए गुण प्रदान नहीं कर सकते।

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