2012-04-16 2 views
1

У меня есть приложение MVC, которое я показываю записи из БД, и я даю возможность создать новую запись. Я использую SignalR для уведомления клиентов, когда обработчик IEvent из Nservicebus завершен.SignalR не вызывает функцию на стороне клиента при обработке события в 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(); 
     } 
    } 

В основном я иду к действию Index, который просто отображает все мои записи и имеет кнопку создать. Я нажимаю кнопку «Создать» @Html.ActionLink("Create", "Create", null, null) и называется методом public ActionResult Create(CreateUserAccountModel user). Чтобы запустить шину и затем перенаправить на действие индекса. Сервисная шина делает свою вещь, и метод UserAccountCreatedNotifyEventHandler Handle запускается соответствующим образом.

Здесь я начинаю видеть некоторые проблемы. Я вызываю соответствующие методы signalr, чтобы получить клиентов, чтобы я мог транслировать сообщение .testMsg(), однако клиенты не получают сообщение.

Итак, короткое замыкание сигнала signal clients.testMsg не работает должным образом. Насколько я знаю, я следую примерам кода, которые я нашел в Интернете, и даже другим тестовым проектам, которые у меня есть. Я предполагаю, что я делаю что-то глупое, но просто не могу его нацелить.

ответ

2

В вашем обработчике вам необходимо создать прокси-сервер для хаба и вызвать метод на прокси-сервере. Ну, вводите прокси-сервер, так как создание его каждый раз будет дорого!

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

+0

Я даю, что попробовать. – Etch

+0

Я использую аналогичный шаблон, но из обработчиков rabbitmq – redsquare

+0

Я действительно нашел проблему с моей конфигурацией NServicebus, которая немного устранила проблему. Сейчас все странно, что мой выше код работает в первый раз, но не работает после. Я готов к работе и попробовать метод .CreateProxy. – Etch

0

попробовать

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

не

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