2013-05-29 41 views
1

我正在使用最新的SignalR(v:1.1.1),并且试图每3秒钟定期简单地调用Hub方法。我在这里看到很多问题并且重复了这种方式,但GetHubContext方法似乎没有返回类的正确实例,所以我不能调用该类的方法。您可以通过以下步骤复制的情况:SignalR(v.1.1.1)从服务器呼叫

MyHub.cs:

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

的Global.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方法。有谁知道我错过了一些非常明显的东西?我只是试图每3秒钟从服务器安排一次到SignalR客户端的呼叫。

回答

1

在您的Global.asax文件上,当您调用'myHub.Clients.All.SendMessage(“Hello World”)'它向客户端发送消息时,它不会调用MyHub类中的SendMessage方法。

请仔细阅读SignalR Documentation看到一些样品

1

我最终改变了轮毂的创建方式:

MyHostHub.cs

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

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); 
} 

我的全球.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中调用的类,但是我的中心具有对主机的引用。

+0

为什么还要在集线器中使用SendMessage()呢?只需在global.asax的循环中调用集线器实例的'triggerMessage'即可 – Julien