receiveMessage事件未调用SignalR

问题描述 投票:0回答:1

SignalR.core.1.1.0,asp.net core 2.2

这些天我正在学习SignalR。我想使用其电子邮件地址将消息发送给特定的身份用户。我的ViewModel包含诸如Username(Email)之类的字段,消息应该在其中发送,SenderId,Text,date。但是问题是即使Hub方法正在调用, connection.on('receiveMessage', addMessageToChat) 也没有命中。下面是我的代码

    <div class="card-footer">
                    <form asp-controller="Home" asp-action="Create"
                          data-ajax-begin="clearInputField" data-ajax-complete=""
                          data-ajax-failure="alert('Fail')" data-ajax-success="sendMessage"
                          data-ajax="true" data-ajax-method="POST">
                        <div asp-validation-summary="ModelOnly" class="text-danger"></div>
                        <div class="input-group">

                            <input type="text" name="UserName" id="UserName" value="" hidden />
                            <textarea name="Text" id="Text" class="form-control type_msg" placeholder="Type your message..."></textarea>
                            <div class="input-group-append">
                                <button type="submit" id="submitButton" class="input-group-text send_btn"><i class="fas fa-location-arrow"></i></button>
                            </div>
                        </div>
                    </form>
</div>

class Message {
    constructor(username, text, when) {
        this.userName = username;
        this.text = text;
        this.when = when;
    }
}
const messagesQueue = [];

function clearInputField() {
    const text = document.getElementById('Text');
    messagesQueue.push(text.value);
    text.value = "";
    console.log("from Clear")
}

function sendMessage() {
    const username = document.getElementById('UserName').value;  
    let text = messagesQueue.shift() || "";
    if (text.trim() === "") return;

    let currentdate = new Date();
    let when =
        (currentdate.getMonth() + 1) + "/"
        + currentdate.getDate() + "/"
        + currentdate.getFullYear() + " "
        + currentdate.toLocaleString('en-US', { hour: 'numeric', minute: 'numeric', hour12: true })
    let message = new Message(username, text,when);
    sendMessageToHub(message);
}
function addMessageToChat(message) {
    console.log("from chat" + message);
    const username = document.getElementById('UserName'); 
    let isCurrentUserMessage = message.userName === username;
    var currentdate = new Date();
    const d =
        (currentdate.getMonth() + 1) + "/"
        + currentdate.getDate() + "/"
        + currentdate.getFullYear() + " "
        + currentdate.toLocaleString('en-US', { hour: 'numeric', minute: 'numeric', hour12: true })
    var image = document.getElementById('userImg').value;
    let className = isCurrentUserMessage ? "justify-content-end" :"justify-content-start";
    var msg = message.text.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;");
    var encodedMsg = ` <div class="d-flex ${className} mb-4">
                                                    <div class="img_cont_msg">
                                                      <img src="${image}" class="rounded-circle user_img_msg">
                                                    </div>
                                                    <div class="msg_cotainer">
                                                       ${msg}
                                                        <span class="msg_time">${message.when}</span>
                                                    </div>
                                               </div>`;
    var li = document.createElement("div");
    li.textContent = encodedMsg;
    document.getElementById("chat").appendChild(li);
}

我的Chat.js

    var connection = new signalR.HubConnectionBuilder()
    .withUrl('/messages')
    .build();

connection.on('ReceiveMessage', addMessageToChat)

connection.start()
    .catch(error => {
        console.error(error.message);
    });

function sendMessageToHub(message) {
    connection.invoke('SendMessage', message);
}

C#集线器

 public async Task SendMessage(MessageViewModel message)
        {
            var user = await UserManager.FindByNameAsync(message.UserName);
            //string userid = Context.UserIdentifier;
            var Claims = new Claim(ClaimTypes.NameIdentifier,user.Id).Value;
            await Clients.User(Claims).SendAsync("ReceiveMessage",message.UserName, message);
        }
javascript asp.net-mvc asp.net-core signalr asp.net-core-2.2
1个回答
0
投票

集线器上的.User(..)属性要求您以某种方式注册用户(在这种情况下为电子邮件地址)。只要您登录用户,SignalR框架就会自动为您完成此操作。

© www.soinside.com 2019 - 2024. All rights reserved.