簡體   English   中英

從MVC控制器添加SignalR集線器組

[英]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根本不存在。

剩下兩個選擇。

  1. 在每個頁面上連接SignalR之后,訂閱更新。 在這種情況下,您將提交一個典型的AddEmail請求,然后在加載View()之后在JavaScript中加載,加載SignalR,進行連接,然后提交hub.server.addEmail(email) 這是SignalR中的標准方法。

  2. 這本質上是同一件事,但是如果您使用的是SPA框架,該框架可讓您在視圖之間持久化SignalR連接,那將起作用。 當然,這是一個非常重大的變化。

我基於所有這些假設,假設您的操作AddEmail實際上是一個頁面,據此推斷它返回一個ViewResult 如果使用AJAX進行調用,則可以將ConnectionId附加為查詢參數,而所有這些都沒有意義。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM