2017-03-07 41 views
2

以下是控制器方法,接收應該踢的userName集線器方法不能從集線器類以外的地方工作

public ActionResult Kick(string userName) 
    { 
     var hub = GlobalHost.ConnectionManager.GetHubContext<ChatHub>();    
     var user = userService.GetUserByName(userName); 
     hub.Clients.Client(user.ConnectionIdInHub).kickUser(); 
     return Json(new { success = true}); 
    } 

kickUser() - 這是一個JS方法。但是,當從控制器方法Kick()執行kickUser()時,客戶端沒有任何事情發生。

chatHub.client.kickUser = function() { 
     window.location.replace(window.kickUserActionUrl); 
    } 

我該怎麼辦才能解決這個問題?

我試着這樣做:

public static void OnKicked(string connectionId) 
     { 
      var hubContext = GlobalHost.ConnectionManager.GetHubContext<ChatHub>(); 
      hubContext.Clients.Client(connectionId).closeConnection(); 
     } 

我這樣調用ChatHub.OnKicked(user.ConnectionIdInHub);樞紐方法 但它仍然無法正常工作

這裏是另一種方式來解決:

我打電話給客戶端setInterval()方法,每10秒發送一次服務器請求。通過在服務器上接收此請求的JSon方法檢查一件事:是當前用戶IsKicked=true,在這種情況下,JSon將發送回new {success=true},並且用戶將在該Kick Page上重新連接。

+1

你在客戶端包含哪些SignalR腳本?只是想驗證你是否包含生成的代理和必要的支持腳本。 –

+0

@RobReagan 你的意思是? ' ' –

+0

這是正確的。謝謝。 –

回答

1

這幫助我從集線器類以外的地方執行集線器方法。你可以像這樣從客戶端調用集線器方法:

var myHub = $.coonection.hubName; 
myHub.server.myMethod; //name of the method should begin with a small letter