2017-09-21 242 views
1

我有一個工作SignalR中心包含一些連續運行的方法,他們管理會話生命週期,連接會話......這些連續運行的方法是使用Timer類執行每X秒。這真的不是一個好的做法,因爲線程泄漏,性能問題,鎖...如何訪問signalr樞紐蔚藍webrole

一個更好的實現將有一個WebRole,所有這些「工作方法」應該在WebRole.cs文件中去,女巫做一個很多意義,因爲這是天藍色角色的目的。

現在的probleme,它無法獲得使用此代碼輪轂方面的工作實例:

var hubContext = GlobalHost.ConnectionManager.GetHubContext<AppHub>(); 
hubContext.Clients.All.Message("hello from webrole"); 

hubContext被實例化(所以不爲空),但即便如此,仍然沒有被廣播到客戶端。沒有錯誤,也沒有例外!

我想發生這種情況,因爲WebRole.csStartup.cs在不同的線程中實例化?

我如何可以訪問WebRole.cs樞紐方面?

謝謝。

+0

''我有一個可用的SignalR Hub''您在哪裏託管SignalR Hub服務器?它是否在Azure Worker角色中? –

+0

@FredHan它的網絡角色 – dafriskymonkey

回答

0

hubContext被實例化(所以不是空),但即便如此,仍然沒有任何廣播給客戶端。沒有錯誤,也沒有例外!

我能在我的身邊重現同樣的問題。廣播消息從WebRole.cs客戶端,你可以嘗試安裝Microsoft.AspNet.SignalR.Client並調用樞紐方法來發送消息給客戶。下面的代碼在Compute Emulator中適用於我,您可以參考它。

WebRole.cs

public class WebRole : RoleEntryPoint 
{ 
    public override bool OnStart() 
    { 
     // For information on handling configuration changes 
     // see the MSDN topic at https://go.microsoft.com/fwlink/?LinkId=166357. 

     return base.OnStart(); 
    } 

    public override void Run() 
    { 
     while (true) 
     { 
      System.Threading.Thread.Sleep(30000); 

      var hub = new Microsoft.AspNet.SignalR.Client.HubConnection("http://localhost:57276/signalr/hubs"); 

      var proxy = hub.CreateHubProxy("ChatHub"); 
      hub.Start().Wait(); 

      //invoke hub method 
      proxy.Invoke("mySend", "hello from webrole; " + DateTime.UtcNow.ToString()); 
     }   
    } 


} 

ChatHub.cs

public class ChatHub : Hub 
{ 
    public void Send(string name, string message) 
    { 
     Clients.All.addNewMessageToPage(name, message); 
    } 

    public void mySend(string message) 
    { 
     Clients.All.addNewMessageToPage("webrole", message); 
    } 
} 

測試結果

enter image description here