我可以使用 SignalR 在所有客户端上触发 AJAX 请求吗?

Posted

技术标签:

【中文标题】我可以使用 SignalR 在所有客户端上触发 AJAX 请求吗?【英文标题】:Can I use SignalR to trigger an AJAX request on all clients? 【发布时间】:2021-10-27 06:25:04 【问题描述】:

我在视图中有一个 DIV,当服务器上的某些数据发生更改时必须刷新该 DIV。 我无法使用间隔定期更新它。数据会因用户在其客户端中执行某项操作而发生变化。

换句话说:用户A点击一个按钮,服务器上的数据发生变化。当页面中的 DIV 刷新时,所有用户都应该“立即”看到更改。

怎么做?

【问题讨论】:

【参考方案1】:

我认为您可以关注this tutorial 来实现您的功能。但是需要根据代码做一些改动。

首先,该教程提供了一个看起来像聊天室的示例,这意味着他的客户端中的一些人点击了发送按钮,然后其他客户端将立即显示新发送的消息。所以我认为它真的很适合你的场景。所有代码都在教程页面中提供,我在下面显示您需要更改的代码。

首先,您可以更改 ChatHub.cs 文件以添加有关更新数据库的逻辑。

public class ChatHub : Hub
    
        public async Task SendMessageToAllAndUpdateData(string user, string message, string state)
        
            //write some code to update the database here
            await Clients.All.SendAsync("ReceiveMessage", user, message, state);
        
    

然后您需要修改 js 文件,该文件现在的工作方式类似于将 li 元素附加到页面,但您应该更改它以更新之前显示的数据。

connection.on("ReceiveMessage", function (user, message, state) 
    var li = document.createElement("li");
    document.getElementById("messagesList").appendChild(li);
    li.textContent = `$user says $message and his state is $state`;
    //write code here to modify the data displayed in the page
    document.getElementById("stateInput").value = state;
);

【讨论】:

以上是关于我可以使用 SignalR 在所有客户端上触发 AJAX 请求吗?的主要内容,如果未能解决你的问题,请参考以下文章

核心 2.1 SignalR 和 SQLDependency

如何在 hubpipleline 之外使用 SignalR 集线器实例

使用 signalr 通知除 self 之外的所有客户端

javascript 文件挂起时 SignalR 连接块

SignalR 通过 K8S Ingress 连接

.net core 3.0 Signalr - 01 基础篇