2013-04-18 10 views
0

Я пробовал SignalR, и я не совсем понимаю, как вызывать методы у моего клиента так, чтобы он вызывал тот же концентратор.SignalR and Hub Persistance

У меня есть два метода в моем хаба:

private ctlDataManager myManager; 
    public void StartConnection() 
    { 
     myManager = new ctlDataManager("test"); 

     myManager.UpdateItemEvent += myManager_UpdateItemEvent; 

     myManager.Connect(); 
    } 

    public void StopConnection() 
    { 
     myManager.Disconnect(); 
    } 

И в моем клиенте я стараюсь называть их так:

var notificationHub = $.connection.notificationHub; 

    $.connection.hub.start() 
     .done(function (state) { 
      $("#submit").click(function (e) { 
       e.preventDefault(); 
       notificationHub.server.startConnection(); 
       return false; 
      }); 

      $("#stop").click(function (e) { 
       e.preventDefault(); 
       notificationHub.server.stopConnection(); 
       return false; 
      }); 
     }); 

Теперь, когда я нажимаю на кнопку запуска, это работает отлично его запускает его и получает данные тоже. Но когда я нажимаю кнопку остановки, он выдает экземпляр ошибки объекта. Похоже, что «myManager» имеет значение NULL. Это почти так же, как новый центр был открыт. Естественно, мне нужно, чтобы он был таким же, как я должен закрыть соединение. Как я могу это сделать?

ответ

0

С моей точки зрения, серверный класс концентратора не сохраняется. Таким образом, объект myManager создается при каждом вызове метода от клиента. Мой совет заключался бы в том, чтобы объявить myManager в другом месте вашего приложения, что вы можете обеспечить 100% -ное время безотказной работы, и ваши методы-серверные узлы свяжутся с ним таким образом.

Один из способов проверить это - отладить конструктор вашего класса концентратора. Вы заметите, что он вызывается для каждого вызова метода client-> server-side.

+0

Thanks SeanP. Ты прав. он создается каждый раз. Теперь я создал статический ConcurrentDictionary, чтобы поддерживать объекты подключения и позволять другим клиентам отслеживать соединения с id, которые я передаю туда и обратно между концентратором и клиентом. Не уверен, что это отличная идея, но скоро увидим. – zawisza

+0

Нет проблем, я столкнулся с тем же самым сценарием. Я не уверен в лучшем подходе к этому, но все зависит от того, с каким видом приложения вы работаете. Для моего веб-приложения MVC4 я поместил объект dictionary/list в Global.asax. Затем я периодически резервирую текущее состояние и все необходимые идентификаторы в базу данных. – SeanPrice

Смежные вопросы