2015-01-22 1 views
2

У меня есть SignalR концентратор с не статическим методом, который добавляет создает новую группу на основе адреса электронной почты, введенный в форме:Добавление группы SignalR концентратора из MVC контроллер

public class EmailHub : Hub 
{ 
    public void AddEmail(string email) 
    { 
     base.Groups.Add(base.Context.ConnectionId, email); 
    } 
} 

Я хотел бы вызовите этот метод Hub с моего контроллера MVC. Мой метод в настоящее время выглядит примерно так:

public class MyController : Controller 
{ 
    public ActionResult AddEmail(string email) 
    { 
     var hub = GlobalHost.ConnectionManager.GetHubContext<EmailHub>(); 
     hub.Clients.All.AddEmail(email); 

     return View(); 
    } 
} 

Однако код в контроллере не вызывает метод хаба. Что я могу изменить, чтобы успешно использовать метод хаба?

ответ

3

Вам необходимо передать ConnectionId в качестве параметра, и вы не сможете получить его до тех пор, пока SignalR не будет подключен.

Соединения SignalR присутствуют только для одного «просмотра страницы» на клиенте. Другими словами, если я перейду к /chat/rooms/1, я получу ConnectionId, затем, если я перейду к /chat/rooms/2, я получу разныеConnectionId. Из-за этого по существу не существует, когда вы пытаетесь использовать его здесь.

Это дает вам два варианта.

  1. Подписаться на обновления после того, как SignalR подключится на каждой странице. В этом случае вы должны подать типичный запрос AddEmail, затем в JavaScript после этого загрузите View(), вы загрузите SignalR, подключитесь, а затем файл hub.server.addEmail(email). Это стандартный подход в SignalR.

  2. Это по сути то же самое, но если вы используете инфраструктуру SPA, которая позволяет вам поддерживать связь SignalR между представлениями, это сработает. Конечно, это довольно значительное изменение.

Я основаны все это при условии, что ваши действия AddEmail фактически страница, которую я вытекает из того что он возвращает ViewResult. Если это вызвано с AJAX, вы можете просто добавить ConnectionId в качестве параметра запроса, и все это будет спорным.