如何使用SignalR仅向触发请求的单个指定客户端推送消息?
实现方案
核心逻辑是将前端获取到的SignalR连接ID提交到服务端后台,后台调用Hub时指定该ID作为发送目标。
1. 修改Default.aspx文件
首先在UpdatePanel内新增隐藏域存储连接ID,同时修改前端JS将获取到的connectionId赋值给隐藏域:
<asp:Content ID="BodyContent" ContentPlaceHolderID="MainContent" runat="server"> <asp:UpdatePanel ID="UpdatePanel1" runat="server"> <ContentTemplate> <!-- 新增隐藏域存储ConnectionID --> <asp:HiddenField ID="hfConnectionId" runat="server" /> <div><br /><br /> <asp:Button ID="btnGo" runat="server" Text="GO!!!" OnClick="btnGo_Click" OnClientClick="this.disabled=true;" UseSubmitBehavior="false" /><br /><br /> <asp:Label ID="lblLog" class="#log" runat="server" Text="Begin"></asp:Label> <br /> <br /> <asp:Label ID="lblConnectionID" runat="server" Text=""></asp:Label> </div> </ContentTemplate> </asp:UpdatePanel> <script src="Scripts/jquery-3.4.1.js"></script> <script src="Scripts/jquery.signalR-2.4.2.js"></script> <script src="signalr/hubs"></script> <script type="text/javascript"> $(function() { var logger = $.connection.logHub; logger.client.logMessage = function(msg) { $("#MainContent_lblLog").html(msg); }; $.connection.hub.start().done(function () { var cid = $.connection.hub.id; $("#MainContent_lblConnectionID").text("ConnectionID: " + cid); // 给隐藏域赋值,提交时会传到后台 $("#MainContent_hfConnectionId").val(cid); }); }); </script> </asp:Content>
2. 修改Default.aspx.cs后台代码
修改btnGo_Click方法,先获取隐藏域存储的connectionId,调用SendMessage时传入该参数:
protected void btnGo_Click(object sender, EventArgs e) { // 先获取当前客户端的ConnectionID string connectionId = hfConnectionId.Value; if (string.IsNullOrEmpty(connectionId)) { lblLog.Text = "SignalR连接未初始化完成,请稍候重试"; return; } //The timer is just to display how long each task takes. Stopwatch stopWatch = new Stopwatch(); stopWatch.Start(); string strMessage = "Hello "; LogHub.SendMessage(strMessage, connectionId); Thread.Sleep(2000); strMessage += "(" + stopWatch.Elapsed.Seconds + " Seconds)<br>what's up bro? "; stopWatch.Restart(); LogHub.SendMessage(strMessage, connectionId); Thread.Sleep(2500); strMessage += "(" + stopWatch.Elapsed.Seconds + " Seconds)<br>Call me soon "; stopWatch.Restart(); LogHub.SendMessage(strMessage, connectionId); Thread.Sleep(3200); strMessage += "(" + stopWatch.Elapsed.Seconds + " Seconds)<br>See you later "; stopWatch.Restart(); LogHub.SendMessage(strMessage, connectionId); Thread.Sleep(1800); strMessage += "(" + stopWatch.Elapsed.Seconds + " Seconds)<br>Okay man. See you "; stopWatch.Restart(); LogHub.SendMessage(strMessage, connectionId); Thread.Sleep(2900); strMessage += "(" + stopWatch.Elapsed.Seconds + " Seconds)<br>We're all Done!"; lblLog.Text = strMessage; stopWatch.Stop(); }
3. 修改LogHub.cs集线器代码
修改SendMessage方法新增connectionId参数,将群发改为指定连接发送:
public class LogHub : Hub { public static void SendMessage(string strMessage, string connectionId) { var hub = GlobalHost.ConnectionManager.GetHubContext("LogHub"); // 仅向指定ConnectionID的客户端发送消息 hub.Clients.Client(connectionId).logMessage(strMessage); } }
修改完成后重新运行即可实现仅点击Go按钮的客户端收到推送消息,其他客户端不会收到。
内容的提问来源于stack exchange,提问作者Amir
相关产品推荐
相关产品推荐

