控制器未调用SignalR



在发布这篇文章之前,我在stackoverflow上读了很多,唯一的帮助是

来自控制器的SignalR调用

https://learn.microsoft.com/en-us/aspnet/core/tutorials/signalr?view=aspnetcore-2.2&tabs=visual studio

我以为他们说的那个错误是我的错误,但没用。因此,当客户端发送消息时,这应该会触发集线器,但不会。。。至少出现了我的控制器就像。。。

//Constructor
private readonly IHubContext<ChatHub> chatHub;
public UserController(IHubContext<ChatHub> hubContext)
{
this.chatHub = hubContext;
}
//Method
[HttpPost]
public async Task<ActionResult> Message(Message message)
{
await chatHub.Clients.All.SendAsync("ReceiveMessage", message.emisor, message.Text);
}

Chat.js

"use strict";
var connection = new signalR.HubConnectionBuilder().withUrl("/chatHub").build();
//Disable send button until connection is established
document.getElementById("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 = document.createElement("li");
li.textContent = encodedMsg;
document.getElementById("messagesList").appendChild(li);
});
connection.start().then(function () {
document.getElementById("sendButton").disabled = false;
}).catch(function (err) {
return console.error(err.toString());
});
document.getElementById("sendButton").addEventListener("click", function (event) {
var user = document.getElementById("userInput").value;
var message = document.getElementById("messageInput").value;
connection.invoke("SendMessage", user, message).catch(function (err) {
return console.error(err.toString());
});
event.preventDefault();
});

ChatHub类

public class ChatHub : Hub
{
public async Task SendMessage(string name, string message)
{
await Clients.All.SendAsync("ReceiveMessage", name, message);
}
}

所以,这个方法在聊天中心上,没有任何参考,如果我调试,没有调用这个方法

您只能从客户端调用hub方法。然后从服务器调用客户端方法。

IHubContext在服务器上,它所做的只是发送到客户端。如果你想";调用集线器方法";然后,您需要从服务器重构代码,以拥有一个hub方法和控制器都可以调用的公共类。

最新更新