2012-08-29 4 views
13

Ich fange gerade an, signalR zu erkunden, und ich möchte Nachrichten vom Server an alle Clients senden können.Wie sende ich Nachrichten von Server zu Client mit SignalR Hubs

Hier ist mein Hub

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using SignalR; 
using SignalR.Hubs; 
using SignalR.Hosting.Common; 
using SignalR.Hosting.AspNet; 
using System.Threading.Tasks; 

namespace MvcApplication1 
{ 
    public class Chat : Hub 
    { 
     public void Send(String message) 
     { 
      // Call the addMessage methods on all clients 
      Clients.addMessage(message); 
     } 
    } 
} 

Hier mein Klient Seite ist

 <script type="text/javascript"> 

     $(function() { 

      //Proxy created on the fly 
      var chat = $.connection.chat; 

      // Declare a function on the chat hub so the server can invoke it 
      chat.addMessage = function (message) { 
       $("#messages").append("<li>" + message + "</li>"); 
      }; 

      $("#broadcast").click(function() { 
       // call the chat method on the server 
       chat.send($("#msg").val()); 
      }); 

      $.connection.hub.start(); 
     }); 
    </script> 


} 



<input type="text" id="msg" /> 
     <input type="button" id="broadcast" value="broadcast" /> 

     <ul id="messages" class="round"> 


     </ul> 

Das alles funktioniert perfekt, ich bin in der Lage zu „chatten“ zwischen zwei verschiedenen Browsern.

Das nächste, was ich tun möchte, ist eine Nachricht vom Server an alle Clients zu initiieren.

Also habe ich das versucht.

using SignalR; 
using System.Web.Http; 
using System.Web.Mvc; 
using System.Web.Optimization; 
using System.Web.Routing; 
using System; 
using System.Web.Routing; 
using SignalR; 
using SignalR.Hubs; 

namespace MvcApplication1 
{ 
    // Note: For instructions on enabling IIS6 or IIS7 classic mode, 
    // visit http://go.microsoft.com/?LinkId=9394801 

    public class MvcApplication : System.Web.HttpApplication 
    { 
     protected void Application_Start() 
     {    
      var aTimer = new System.Timers.Timer(1000); 

      aTimer.Elapsed += aTimer_Elapsed; 
      aTimer.Interval = 3000; 
      aTimer.Enabled = true; 

      AreaRegistration.RegisterAllAreas(); 

      WebApiConfig.Register(GlobalConfiguration.Configuration); 
      FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); 
      RouteConfig.RegisterRoutes(RouteTable.Routes); 
      BundleConfig.RegisterBundles(BundleTable.Bundles); 
      AuthConfig.RegisterAuth(); 
     } 

     void aTimer_Elapsed(object sender, System.Timers.ElapsedEventArgs e) 
     { 
      var context = GlobalHost.ConnectionManager.GetHubContext<Chat>(); 
      context.Clients.Send("Hello");  
     } 
    } 
} 

Dies scheint nicht zu funktionieren. Der Timer funktioniert, der Ereignishandler "aTimer_Elapsed" wird alle 3 Sekunden ausgeführt, aber die Methode "Send" im Chat-Hub wird nie ausgeführt.

Irgendwelche Ideen?

Antwort

25

ich denke, es

void aTimer_Elapsed(object sender, System.Timers.ElapsedEventArgs e) 
    { 
     var context = GlobalHost.ConnectionManager.GetHubContext<Chat>(); 
     context.Clients.All.addMessage("Hello");  
    } 

stattdessen sein sollte. Mit Senden rufen Sie die Methode vom Client verwendet, um den Server zu nennen ...

+1

Was ist, wenn ich in der Lage sein möchte, eine Nachricht an einen bestimmten Client zu senden, wenn die Daten in einer Tabelle in der Datenbank geändert werden, entweder direkt über die DBMS-Konsole oder über eine Desktop-App oder meine Website? –

+0

@MuhammadMamoorKhan Um einen einzelnen Client anzusprechen, müssen Sie die Verbindungs-ID des Clients kennen. Dann können Sie 'GlobalHost.ConnectionManager.GetHubContext () .Clients.Client (connectionId) .addMessage (" etwas hier ");' – Corey

0

Ja Sie diese Zeile einstellen müssen:

void aTimer_Elapsed(object sender, System.Timers.ElapsedEventArgs e) 
    { 
     var context = GlobalHost.ConnectionManager.GetHubContext<Chat>(); 
     context.Clients.All.addMessage("Hello");  
    } 

Doch diese nur auf halbem Weg ist und noch nicht funktionieren.

In Ihrem Js müssen Sie schreiben:

$(function() { 

//Proxy created on the fly 
var chat = $.connection.chat; 

// Declare a function on the chat hub so the server can invoke it 
chat.client.addMessage = function (message) { 
    $("#messages").append("<li>" + message + "</li>"); 
}; 

$("#broadcast").click(function() { 
    // call the chat method on the server 
    chat.client.addMessage($("#msg").val()); 
}); 

$.connection.hub.start(); 
}); 

ich die chat.client diesen hinzugefügt wird eine clientseitige Hub Methode hinzufügen, dass der Server aufruft.