来自控制器的 SignalR 调用

Posted

技术标签:

【中文标题】来自控制器的 SignalR 调用【英文标题】:SignalR call from controller 【发布时间】:2020-12-22 13:04:28 【问题描述】:

我需要将字符串从我的控制器传递到 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] 信息:将“/Signalr”规范化为 'https://localhost:44336/Signalr'。

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

【问题讨论】:

【参考方案1】:
await _errorHub.Clients.All.SendAsync("SendMessage", message);

“SendMessage” 应为 “ReceiveMessage”

【讨论】:

【参考方案2】:

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

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

【讨论】:

以上是关于来自控制器的 SignalR 调用的主要内容,如果未能解决你的问题,请参考以下文章

从 Web API 控制器调用 SignalR 集线器时出现问题

从不同的 AppDomain 调用 SignalR 方法

从 Mac 中的 ios 客户端调用 PC 中的 signalR 服务器

C# SignalR 异常 - 在收到调用结果之前连接开始重新连接

是否有明确的 SignalR 集线器版本控制策略,以便旧的 JS 代码可以继续工作?

C#SignalR异常 - 在收到调用结果之前,连接开始重新连接