2011-10-03 14 views
68

में कहीं और से सिग्नलआर हब क्लाइंट को कॉल करना मैंने सर्वर और क्लाइंट के बीच संवाद करने के लिए सिग्नलआर हब सेट अप किया है। हब सर्वर साइड कोड Hooking.cs नामक कक्षा में संग्रहीत किया जाता है। मैं चाहता हूं कि हुकिंग.cs में परिभाषित एक विधि को कॉल करने में सक्षम होना है ताकि मुझे किसी भी कनेक्टेड क्लाइंट को मेरे एप्लिकेशन में कहीं से भी संदेशों को प्रसारित करने की अनुमति मिल सके। ऐसा लगता है कि Hooking.cs का एक नया उदाहरण हर ग्राहक/सर्वर कॉल के लिए बनाई गई है, इसलिए मैं आशा व्यक्त की थी कि मैं विधि परीक्षा (साथ की तरहसिस्टम

var hooking = new Hooking(); 
hooking.Test(); 

कुछ का उपयोग करने में सक्षम होगा) Hooking.cs में परिभाषित किया गया इस तरह के

public static void Test() { 
    Clients.test() 
} 

के रूप में और एक ग्राहक के पक्ष जावास्क्रिप्ट

var hooking = $.connection.hooking; 
hooking.test = function() { alert("test worked"); }; 
$.connection.hub.start() 

दुर्भाग्य से ऐसा नहीं है कि के साथ सरल, क्योंकि ग्राहक स्थैतिक नहीं हैं, इसलिए स्थिर विधि से पहुंच योग्य नहीं है।

सिग्नलआर स्रोत कोड के माध्यम से देखकर मैं एक विधि में आया जो आशाजनक लग रहा था, Hubs.Invoke(string hubName, string method, params object[] args), इसलिए मुझे आशा है कि मैं Hubs.Invoke("Hooking", "Test") जैसे कुछ उपयोग कर सकता हूं लेकिन मैं इसे काम नहीं कर सकता।

किसी भी मदद के इस के साथ बेहद सराहना की जाएगी

+0

लेकिन शायद आप मेरी मदद कर सकते हैं;) किसी भी विचार से सभी अन्य ग्राहकों के लिए अपने प्रसारण संदेश में अपना जेएस कोड कैसे करें, न कि मूल कॉलर जिन्होंने संदेश जारी किया? :) – GONeale

+0

दुर्भाग्य से मैं नहीं करता हूं। मैं क्लाइंट आईडी को प्रतिक्रिया के साथ वापस भेज रहा हूं, और प्रतिक्रिया के साथ क्लाइंट आईडी को वापस भेज रहा हूं, और आईडी के मैच –

उत्तर

1

यह कैसे https://github.com/SignalR/SignalR से SignalR.Samples.Hubs.Chat में Chat.cs में किया है पर एक नज़र डालें।

मैं वहां देख सकता हूं कि स्थैतिक Dictionary<TKey, TValue> को शीर्ष पर तुरंत चालू किया जा रहा है, इसलिए मुझे लगता है कि उन्हें लगातार बनाए रखा जा रहा है, या तो Chat कक्षा एक सतत उदाहरण (?) या उस सरणी को किसी भी तरह अद्यतन किया जा रहा है।

इसे देखें, डेविड फाउलर शायद इस पर सबसे अच्छा होगा।

+0

पर फ़ंक्शन को कॉल नहीं कर रहा हूं हाँ, मैं इसे साइन करने और इसे करने के लिए सिग्नलआर नमूने का उपयोग कर रहा हूं। शब्दकोश स्थिर हैं, इसलिए जानकारी कक्षा के कई उदाहरणों पर बनी हुई है, इसलिए मुझे उम्मीद थी कि मैं बस हुकिंग.cs का एक उदाहरण बना सकता हूं और इसका उपयोग कर सकता हूं, लेकिन यह –

23

Hub.GetClients संस्करण 0.4.0 में गायब हो गया है।

wiki से आप अब उपयोग कर सकते हैं:,

var context = GlobalHost.ConnectionManager.GetHubContext<MyHub>(); 
context.Clients.All.addMessage(message); 

मूल रूप से आप के लिए वर्तमान मेजबान के लिए निर्भरता समाधानकर्ता का उपयोग कर सकते हैं:

IConnectionManager connectionManager = AspNetHost.DependencyResolver.Resolve<IConnectionManager>(); 
dynamic clients = connectionManager.GetClients<MyHub>(); 
+7

काम नहीं करता है और जोड़ना न भूलें 'सिग्नलआर इंफ्रास्ट्रक्चर का उपयोग करना;' – nmat

101

यह SignalR 2.x के लिए सही तरीका क्या है IConnectionManager इंटरफ़ेस को हल करें जो आपको एक हब के लिए संदर्भ ऑब्जेक्ट को पकड़ने की अनुमति देता है।

अधिक जानकारी official documentation में मिल सकती है।

5

आप आसानी से इस-

public class ClassName 
{ 
    ........ 
    ........ 
    private IHubContext _hub; 

    public BulletinSenderController(IConnectionManager connectionManager) 
    { 
     _hub = connectionManager.GetHubContext<McpHub>(); 
     ........ 
     ........ 
    } 

    ............ 
    ............ 
} 

2 की तरह निर्भरता इंजेक्शन द्वारा यह 2 कदम

  1. instantiating का पालन करके एक हब उपयोग कर सकते हैं।की तरह इस-

    _hub.Clients.All.onBulletinSent(bulletinToSend); 
    

    अधिक hub वस्तु का उपयोग करते हुए पाया जा सकता है here

    उदाहरण कोड in this git repo पाया जा सकता है।

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