[英]Adding a SignalR Hub Group from an MVC Controller
我有一個帶有非靜態方法的SignalR集線器,該方法會根據在表格中輸入的電子郵件地址添加一個新組:
public class EmailHub : Hub
{
public void AddEmail(string email)
{
base.Groups.Add(base.Context.ConnectionId, email);
}
}
我想從我的MVC控制器調用此Hub方法。 我的方法目前看起來像這樣:
public class MyController : Controller
{
public ActionResult AddEmail(string email)
{
var hub = GlobalHost.ConnectionManager.GetHubContext<EmailHub>();
hub.Clients.All.AddEmail(email);
return View();
}
}
但是,控制器中的代碼不會調用hub方法。 我可以更改什么才能成功調用hub方法?
您必須將ConnectionId
作為參數傳遞,直到SignalR已連接,您才能獲得它。
SignalR連接僅在客戶端上存在一個“頁面視圖”。 換句話說,如果我去/chat/rooms/1
,我得到一個ConnectionId
,然后,如果我導航到/chat/rooms/2
,我得到一個不同的 ConnectionId
。 因此,當您嘗試在此處使用base.Context.ConnectionId
時, base.Context.ConnectionId
根本不存在。
剩下兩個選擇。
在每個頁面上連接SignalR之后,訂閱更新。 在這種情況下,您將提交一個典型的AddEmail
請求,然后在加載View()
之后在JavaScript中加載,加載SignalR,進行連接,然后提交hub.server.addEmail(email)
。 這是SignalR中的標准方法。
這本質上是同一件事,但是如果您使用的是SPA框架,該框架可讓您在視圖之間持久化SignalR連接,那將起作用。 當然,這是一個非常重大的變化。
我基於所有這些假設,假設您的操作AddEmail
實際上是一個頁面,據此推斷它返回一個ViewResult
。 如果使用AJAX進行調用,則可以將ConnectionId
附加為查詢參數,而所有這些都沒有意義。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.