我如何在Signalr中映射用户连接和用户ID,以便可以向特定用户发送消息 [英] How do i map user connection and user id in signalr so that i can send a message to a specific user

查看:48
本文介绍了我如何在Signalr中映射用户连接和用户ID,以便可以向特定用户发送消息的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想向用户发送私人消息,我创建了一个中心,但是不幸的是我不知道如何在Signalr核心中做到这一点,文档中也没有任何文章.

I want to send a private message to a user, i have created a hub but unfortunately i have no idea how to do it in signalr core, the documentation also doesn't have any article in it.

推荐答案

我如何在Signalr中映射用户连接和用户ID,以便可以向特定用户发送消息

How do i map user connection and user id in signalr so that i can send a message to a specific user

要达到上述要求,请参考以下示例.

To achieve above requirement, please refer to the following example.

ChatHub类:

public class ChatHub : Hub
{
    public static List<KeyValuePair<string, string>> ConnectedIds = new List<KeyValuePair<string, string>>();

    public async Task SendMessage(string user, string message)
    {
        await Clients.Others.SendAsync("NoteUpdateNotification", user, message);

        await Clients.All.SendAsync("ReceiveMessage", user, message);
    }

    public async Task SendPrivateMessage(string user, string message, string conid)
    {
        await Clients.Client(conid).SendAsync("ReceiveMessage", user, message + " (private message)");
    }

    public override async Task OnConnectedAsync()
    {
        var connId = Context.ConnectionId;

        var name = Context.GetHttpContext().Request.Query["user"].ToString();

        ConnectedIds.Add(new KeyValuePair<string, string>(connId, name));

        await Clients.All.SendAsync("updateList", ConnectedIds);

        await base.OnConnectedAsync();
    }
}

SignalR JavaScript客户端:

SignalR JavaScript Client:

<h1>PrivateChat</h1>

<div class="container">
    <div class="row">&nbsp;</div>
    <div class="row">
        <div class="col-6">&nbsp;</div>
        <div class="col-6">
            User..........
    <span id="uname"></span>
    @*<input type="text" id="userInput" />*@
            <br />
            Message...<input type="text" id="messageInput" />
            <input type="button" id="sendButton" value="Send Message" />
        </div>
    </div>
    <div class="row">
        <div class="col-12">
            <hr />
        </div>
    </div>
    <div class="row">
        <div class="col-6">&nbsp;</div>
        <div class="col-6">
            <ul id="messagesList"></ul>
        </div>
    </div>

    <div class="row">
        <div class="col-12">
            <hr />
        </div>
    </div>
    <div class="row">
        <div class="col-6">&nbsp;</div>
        <div class="col-6">
            <h2>Online Users</h2>
            <div>
                <!--<ul id="user_list"></ul>-->
                <div id="online"></div>
            </div>
        </div>
        <div class="col-12">
            <hr />
        </div>
        <div class="col-6">&nbsp;</div>
        <div class="col-6">
            <h2>Private Message</h2>
            <div id="user_id"></div>
            <input type="text" id="txtPrivateMessage" />
            <input type="button" id="sendprivatemessage" value="Send Private Message" />
            <input type="hidden" id="pconnId" value="" />
            <ul id="privatemessagelogs"></ul>
        </div>
    </div>
</div>


<script>
    var user = prompt('Enter your name:', '');
    $("#uname").text(user);
    var connection = new signalR.HubConnectionBuilder().withUrl("/chatHub?user=" + user).build();

    //Disable send button until connection is established
    $("#sendButton").disabled = true;

    connection.on("ReceiveMessage", function (user, message) {
        var msg = message.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;");
        var encodedMsg = user + " says " + msg;

        var li = "<li>" + encodedMsg + "</li>";
        $("#messagesList").append(li);
    });

    connection.on("updateList", function (ids) {
        $('#online').empty();
        console.log(ids);

        $.each(ids, function (k, v) {
            console.log(v["key"] + "/" + v["value"]);

            if (v["value"].toString() != user) {
                $('#online').append("<span onclick=getValue('" + v["key"] + "','" + v["value"] + "')>" + v["value"] + "</span><br/>");
            }
        });
    });


    connection.start().then(function () {
        $("#sendButton").disabled = false;

    }).catch(function (err) {
        return console.error(err.toString());
    });

    $("#sendButton").on("click", function (event) {
        var message = $("#messageInput").val();

        connection.invoke("SendMessage", user, message).catch(function (err) {
            return console.error(err.toString());
        });
        event.preventDefault();
    });

    $("#sendprivatemessage").on("click", function (event) {
        var message = $("#txtPrivateMessage").val();
        var conid = $("#pconnId").val();
        connection.invoke("SendPrivateMessage", user, message, conid).catch(function (err) {
            return console.error(err.toString());
        });

        $('#privatemessagelogs').append('<li><strong>You sent: </strong>:&nbsp;&nbsp;' + $("#txtPrivateMessage").val() + '</li>');

        event.preventDefault();
    });

    function getValue(userId, name) {
        $("#user_id").text("Name: " + name + "Connection Id: " + userId);

        $("#pconnId").val(userId);

        $("#txtPrivateMessage").val("");

        $('#privatemessagelogs').empty();
    }
</script>

测试结果:

注意:上面的示例仅用于测试目的,如果要将用户映射到生产环境上的连接,则可以将永久外部存储(例如数据库或Azure表存储)用于存储连接信息.

Note: The above example just for testing purpose, if you'd like to mapping user to connections on production environment, you can use permanent external storage, such as a database or Azure table storage for storing connection information.

这篇关于我如何在Signalr中映射用户连接和用户ID,以便可以向特定用户发送消息的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆