来自控制器的 SignalR 调用

SignalR call from controller

我需要将字符串从我的控制器传递到 signalR 集线器并让它呈现在我的页面上。我遵循了以下位置的聊天教程:https://docs.microsoft.com/en-us/aspnet/core/tutorials/signalr?view=aspnetcore-2.2&tabs=visual-studio

聊天教程的下一步是打破它对我的控制器的消息调用,如下所示:

[HttpPost]
public async Task<IActionResult> Upload(string engineType)
{
    try
    {
        var message = "File Upload Failed";
        
        await _errorHub.Clients.All.SendAsync("SendMessage", message);
        return Ok();
    }
    catch (Exception ex)
    {
        Log.Error("File Upload failed: " + ex);
        return NotFound();
    }
}

我已将我的集线器注入我的控制器,这就是我能够访问 Clients.All... 调用的方式。

我的集线器与教程的唯一不同在于我删除了用户参数:

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

最后,在我的 javascript 中,我设置了以下 SignalR:

var connection = new signalR.HubConnectionBuilder().withUrl("myURL").build();

connection.on("ReceiveMessage", function (user, message) {
    console.log("ReceiveMessage");
    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);
});

当我 运行 我的项目时,控制台输出通知我集线器设置正常,如下所示:

[2020-09-03T09:45:23.384Z] Information: Normalizing '/Signalr' to 'https://localhost:44336/Signalr'.

但是,当我触发上传方法时,没有任何内容发送到我的集线器。我做错了什么?

您正在控制器中调用 _errorHub.Clients.All.SendAsync("SendMessage", message) 而不是 _errorHub.SendMessage(message)。这意味着你的控制器直接在你的客户端上调用 SendMessage,但你的客户端只听 ReceiveMessage.

因此,您需要在您的控制器中调用 _errorHub.SendMessage(message),后者又会调用 Clients.All.SendAsync("ReceiveMessage", message),这将触发您的客户端 ReceiveMessage 方法

await _errorHub.Clients.All.SendAsync("SendMessage", message);

"SendMessage" 应该是 "ReceiveMessage"