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, "&").replace(/</g, "<").replace(/>/g, ">");
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);
}
集线器上的.User(..)
属性要求您以某种方式注册用户(在这种情况下为电子邮件地址)。只要您登录用户,SignalR框架就会自动为您完成此操作。