You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 21:45:03