2012-07-13 4 views
6

यह SignalR + posting a message to a Hub via an action method से संबंधित है, लेकिन मेरे सवाल पर कुछ भिन्न है करने के लिए सर्वर से signalr संदेश भेजें।सभी ग्राहकों

public class MyHub : Hub 
{ 
    public void SendMessage(string message) 
    { 
     // Any other logic here 
     Clients.messageRecieved(message); 
    } 

    ... 
} 

तो 0.5.2 में, मैं (सभी ग्राहकों के लिए एक संदेश भेजना चाहते हैं: पुराने संस्करणों में, आप जो है कि मैं क्या है हब सभी ग्राहकों, करने के लिए संदेश भेजने के लिए पर तरीकों बनाने के लिए प्रोत्साहित किया गया नियंत्रक में कहीं से कहें)। मैं MyHub उदाहरण तक पहुंच कैसे प्राप्त कर सकता हूं?

एक ही रास्ता मैं संदर्भित देखा है:

var hubContext = GlobalHost.ConnectionManager.GetHubContext<MyHub>(); 
hubContext.Clients.messageRecieved("hello"); 

कौन सा ठीक है, लेकिन मैं अपने हब पर विधि कॉल करना चाहते हैं।

+0

यह अब एएसपी.नेट कोर में भी संभव है (हालांकि सिग्नलर अभी भी वर्तमान समय में अल्फा में है)। इस प्रश्न के कोर संस्करण पर [यह विस्तृत उत्तर] देखें (http://stackoverflow.com/a/38832879/957950)। – brichins

उत्तर

18

आप एक स्थिर विधि का उपयोग कर ऐसा कर सकते हैं:

SignalR v.04-

public class MyHub : Hub 
{ 
    internal static void SendMessage(string message) 
    { 
     var connectionManager = (IConnectionManager)AspNetHost.DependencyResolver.GetService(typeof(IConnectionManager)); 
     dynamic allClients = connectionManager.GetClients<MyHub>(); 
     allClients.messageRecieved(message); 
    } 

    ... 
} 

SignalR 0.5+

public class MyHub : Hub 
{ 
    internal static void SendMessage(string message) 
    { 
     IHubContext context = GlobalHost.ConnectionManager.GetHubContext<MyHub>(); 
     context.Clients.messageRecieved(message); 
    } 

    ... 
} 

फिर आप तो इस तरह कॉल कर सकते हैं:

MyHub.SendMessage("The Message!"); 

अच्छा articl SignalR एपीआई पर ई: http://weblogs.asp.net/davidfowler/archive/2012/05/04/api-improvements-made-in-signalr-0-5.aspx

टिप्पणी में पाओलो मोरेटी द्वारा प्रदान

+1

'AspNetHost.DependencyResolver' सिग्नल 0.5+ में गायब हो गया है। [यहां] देखें (http://weblogs.asp.net/davidfowler/archive/2012/05/04/api-improvements-made-in-signalr-0-5.aspx) (कनेक्शन/हब का संदर्भ प्राप्त करना कनेक्शन या हब के बाहर) –

+0

@PaoloMoretti - टिप के लिए धन्यवाद! – Paul

+0

चीयर्स, यह चाल है! –

4

मैं था एक ही समस्या है, मेरे उदाहरण addNotification में है क्लाइंट साइड विधि:

var hubContext = GlobalHost.ConnectionManager.GetHubContext<SignalR.NotificationsHub>(); 
hubContext.Clients.addNotification("Text here"); 

आप क्लाइंट पक्ष पर आप addNotification में अपना हब विधि कॉल करने के कोड जोड़ सकते हैं:

var notification = $.connection.notificationHub; 
notification.addNotification = function (message) { 
notification.addServerNotification(message); // Server Side method 
} 

$.connection.hub.start(); 

हब:

[HubName("notificationHub")] 
    public class NotificationsHub : Hub 
    { 
     public void addServerNotification(string message) 
     { 
      //do your thing 
     } 
    } 

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

[HttpPost] 
    [Authorize] 
    public ActionResult Add(Item item) 
    { 
     MyHubMethodCopy(item); 
     var hubContext = GlobalHost.ConnectionManager.GetHubContext<SignalR.NotificationsHub>(); 
    hubContext.Clients.addNotification("Items were added"); 

    } 

    private void MyHubMethodCopy(Item item) 
    { 
     itemService.AddItem(item); 
    } 
+0

अन्य प्रतिक्रिया मेरे प्रश्न का उत्तर देती है लेकिन आपको +1 मिलती है क्योंकि प्रतिबिंब पर, मुझे यकीन नहीं है कि मुझे एक हब विधि कॉल करने की आवश्यकता है - जैसे कि आप कहते हैं कि 'हब विधियों का उपयोग क्लाइंट से किया जा सकता है' –

+0

+1 इंगित करने के लिए +1 हब विधियों का उपयोग कैसे करें। मैं वही गलती करने वाला था। इसके बाद इसे ठीक कर दिया। –

+0

@emrenevayeshirazi क्या गलती है? – sotn