SignalR (v.1.1.1) Звонок с сервера

Я использую последнюю версию SignalR (v: 1.1.1) и периодически пытаюсь просто вызывать метод Hub каждые 3 секунды. Я видел здесь много вопросов и продублировал способ, но метод GetHubContext, похоже, не возвращает правильный экземпляр класса, поэтому я не могу вызывать методы этого класса. Вы можете продублировать случай, выполнив следующие действия:

MyHub.cs:

 public class MyHub : Hub
{
    public void SendMessage(string message)
    {
        Clients.All.triggerMessage(message);
    }
}

Глобальный.asax:

  Task.Factory.StartNew(() =>
   {
     while (true)
     {
       var myHub = GlobalHost.ConnectionManager.GetHubContext<MyHub>();
       myHub.Clients.All.SendMessage("Hello World");
       System.Threading.Thread.Sleep(3000);
     }
   })
   .ContinueWith(t => { throw new Exception("The task threw an exception", t.Exception); }, TaskContinuationOptions.OnlyOnFaulted);

Я думаю, что это настолько просто, насколько это возможно. Я думаю, что это правильный способ сделать это, но отладчик никогда не использует метод SendMessage. Кто-нибудь знает, я пропустил что-то очень очевидное? Я просто пытаюсь запланировать вызов клиента SignalR с сервера каждые 3 секунды.


person aminjam    schedule 29.05.2013    source источник


Ответы (2)


В вашем файле Global.asax, когда вы вызываете myHub.Clients.All.SendMessage("Hello World"), он отправляет сообщение клиенту, а не вызывает метод SendMessage в вашем классе MyHub.

Прочтите документацию по SignalR, чтобы увидеть несколько примеров.

person Gustavo Armenta    schedule 30.05.2013

Я закончил изменение способа создания концентратора:

MyHostHub.cs

private readonly MyHost _host;
public MyHostHub(){ _host = new MyHost(); }

Мой хост:

 private readonly static Lazy<IHubConnectionContext> _clients = new Lazy<IHubConnectionContext>(() => GlobalHost.ConnectionManager.GetHubContext<MyHostHub>().Clients);
 private IHubConnectionContext Clients
 {
    get { return _clients.Value; }
 }
 public void SendMessage(string message)
 {
    Clients.All.triggerMessage(message);
 }

Мой Global.asax:

            Task.Factory.StartNew(() =>
        {
            while (true)
            {
                var myHost = ObjectFactory.GetInstance<MyHost>();
                myHost.SendMessage();
                Thread.Sleep(3000);
            }
        })
        .ContinueWith(t => { throw new Exception("The task threw an exception", t.Exception); }, TaskContinuationOptions.OnlyOnFaulted);

Кажется, это работает нормально. По сути, я переместил код из класса Hub в другой класс, который я могу вызывать в Global.asax, но в моем концентраторе есть ссылка на хост.

person aminjam    schedule 30.05.2013
comment
Зачем вообще заморачиваться с SendMessage() в хабе? просто вызовите triggerMessage из экземпляра вашего концентратора в вашем цикле в global.asax - person Julien; 11.07.2013