【问题标题】:How I can Use IUserIdPriver? where am I doing wrong?如何使用 IUserIdPriver?我在哪里做错了?
【发布时间】:2021-01-08 17:27:10
【问题描述】:

我在 asp.net core mvc signalr 项目中工作。我想向特定用户发送消息。我阅读了很多关于此的文章,并在 * 中查看了有关此问题的一些解决方案,但我仍然无法做到这一点。我想向用户发送消息,使用存储在数据库中的用户电子邮件,而不是唯一的连接 ID。我该如何填写这些方法?我填不上。 这是我的中心类

 public class SignalRChat:Hub
    {

       
        public async Task ClientSendMessage(string connectionId,string user, string message)
        {
            await Clients.Client(connectionId).SendAsync("ReceiveMessage",user, message);
        }
       

        public async override Task OnConnectedAsync()
        {

            await Clients.Caller.SendAsync("connected", Context.ConnectionId);
            
          
        }

    }

这是我的 CustomProvider 类

 public class CustomProvider : IUserIdProvider
    {
        public string GetUserId(HubConnectionContext connection)
        {
            throw new NotImplementedException();
        }
    }

这是js代码

"use strict";


$(document).ready(() => {
    var connection = new signalR.HubConnectionBuilder().withUrl("/chathub").build();
    connection.on("connected", connecitonid => $("#connectionId").html(connecitonid));

    connection.start();

    $("button").click(() => {
        let message = $("#txtMessage").val();
        var user = $("#sender").val();
        connection.invoke("ClientSendMessage", $("#client").val(),user, message)
            .catch(error => console.log("Error." + error));
        var div = document.createElement("div");
        div.textContent = "me" + ":" + message;
        document.getElementById("son").appendChild(div);
    });

    connection.on("ReceiveMessage", function (user, message) {
        var msg = message.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;");
        var encodedMsg = user + ":" + msg;
        var div = document.createElement("div");
        div.textContent = encodedMsg;
        document.getElementById("son").appendChild(div);
        
    });

});

这是html代码

 <div id="chat" style="display:none;margin-left:30%;">

        <div class="container">
            <div class="row"><h5>Connection ID : <span id="connectionId"></span></h5></div>
            <div class="row">
                <div class="col-md-7"><input type="text" id="sender" value="Sender Name"></div>
            </div>
            <div class="row">
                <div class="col-md-7"><input type="text" placeholder="ReceiverId" id="client"></div>
            </div>
            <div class="row">
                <div class="col-md-7"> <input type="text" id="txtMessage"> <button>Send</button></div>
            </div>
            <div class="row">
                <div class="col-md-7" id="son"> </div>
            </div>


        </div>
        
        
    </div>

这就是代码的显示方式 I dont want this id I wanna use email adress

【问题讨论】:

    标签: asp.net-core asp.net-core-mvc signalr chat asp.net-core-signalr


    【解决方案1】:

    看来您应该阅读有关使用用户的文档:https://docs.microsoft.com/aspnet/core/signalr/groups?view=aspnetcore-5.0#users-in-signalr

    基本上,您会在自定义IUserIdProvider 中使用电子邮件声明,然后在发送到该电子邮件时使用Clients.User(user).SendAsync(...)

    【讨论】:

    • 如何根据您的建议编辑js文件和hub类?