2012-04-16 2 views
1

J'ai une application MVC qui affiche des enregistrements de la base de données et je donne la possibilité de créer un nouvel enregistrement. J'utilise SignalR pour notifier les clients lorsque le gestionnaire IEvent de Nservicebus est terminé.SignalR n'appelle pas la fonction côté client lors de la gestion d'un événement dans NServiceBus

Index.cshtml

<script src="signalr/hubs" type="text/javascript"></script> 
<script> 
    var myHub; 

    $(function() { 
     myHub = $.connection.userAccountHub; 

     //add handler to handle the nofication 
     myHub.testMsg = function() { 
      alert("I would really like for this to work"); 
     }; 

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

UserController.cs

public class UserController : Controller 
    { 
     private readonly IBus _bus;  


public ActionResult Index() 
     { 
      return View(getalldata()); 
     } 


[HttpPost] 
     public ActionResult Create(CreateUserAccountModel user) 
     { 
      if (ModelState.IsValid) 
      { 
       _bus.Send(new CreateUserAccountCommand 
       { 
        FirstName = user.FirstName, 
        LastName = user.LastName, 
        NetworkLogin = user.NetworkLogin 
       }); 

       return RedirectToAction("Index"); 
      } 

      return View(user); 
     } 

UserAccountHub

public class UserAccountHub : Hub 
    { 

    } 

UserAccountCreatedNotifyEventHandler.cs

public class UserAccountCreatedNotifyEventHandler : IHandleMessages<UserAccountCreatedNotifyEvent> 
    { 
     public void Handle(UserAccountCreatedNotifyEvent message) 
     { 
      IConnectionManager connectionManager = AspNetHost.DependencyResolver.Resolve<IConnectionManager>(); 
      dynamic clients = connectionManager.GetClients<UserAccountHub>(); 

      clients.testMsg(); 
     } 
    } 

Fondamentalement, je vais à l'action d'index qui affiche simplement tous mes dossiers et a un bouton créer. Je clique sur le bouton créer @Html.ActionLink("Create", "Create", null, null) et il a appelé la méthode public ActionResult Create(CreateUserAccountModel user). Pour démarrer le bus, puis redirige vers l'action d'index. Le bus de service fait sa chose et la méthode UserAccountCreatedNotifyEventHandler Handle est déclenchée de manière appropriée.

C'est là que je commence à voir quelques problèmes. J'appelle les méthodes de signalr appropriées pour obtenir les clients afin que je puisse diffuser un message .testMsg() cependant les clients ne reçoivent pas le message.

Donc, en bref, mon signal clients.testMsg ne fonctionne pas comme prévu. À ma connaissance, je suis les exemples de code que j'ai trouvés sur le web, et même d'autres projets de test que j'ai. Je suppose que je fais quelque chose de stupide, mais je ne peux pas le cibler.

Répondre

2

Dans votre gestionnaire, vous devez créer un proxy au concentrateur et appeler la méthode sur le proxy. Eh bien, injectez le proxy car le créer à chaque fois serait cher!

Voir http://www.asp.net/signalr/overview/signalr-20/hubs-api/hubs-api-guide-net-client

+0

Je donne qu'un essai. – Etch

+0

J'utilise un modèle similaire, mais à partir des gestionnaires rabbitmq – redsquare

+0

J'ai effectivement trouvé un problème avec ma configuration NServicebus qui a réglé un peu le problème. Ce qui est étrange maintenant, c'est que mon code ci-dessus fonctionne la première fois, mais ne fonctionne pas après. Je suis sur le point de creuser et d'essayer la méthode .CreateProxy. – Etch

0

essayer

myHub.client.testMsg = function(){....} 

pas

myHub.testMsg = function(){....} 
Questions connexes