【问题标题】:Controller did not call the SignalR控制器没有调用 SignalR
【发布时间】:2020-12-02 02:53:40
【问题描述】:

在发布此之前,我在 stackoverflow 上阅读了很多内容,唯一的帮助是,但不是真的,

SignalR call from controller

https://docs.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);
}

聊天.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);
        }
    }

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

【问题讨论】:

    标签: c# model-view-controller signalr


    【解决方案1】:

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

    IHubContext 在服务器上,它所做的只是发送给客户端。如果你想从服务器“调用一个集线器方法”,那么你需要重构你的代码以拥有一个集线器方法调用和你的控制器调用的公共类。

    【讨论】:

    • 那么...我需要从控制器调用SendMessage方法??
    • 没有。如果您有共同的逻辑,希望集线器方法和控制器都调用,那么您应该将该逻辑放在集线器和控制器都使用的类中。例如:class DoSomething { // called from Hub and from Controller public Task SendMessage(IHubContext&lt;ChatHub&gt; context) { // do something } }
    • 所以...这样,当我从控制器调用类时,它将自动实例化集线器类对吗??
    猜你喜欢
    • 2020-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-03
    • 1970-01-01
    • 2018-12-18
    • 2016-12-03
    • 1970-01-01
    相关资源
    最近更新 更多