来自控制器的 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, "&").replace(/</g, "<").replace(/>/g, ">");
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"
我需要将字符串从我的控制器传递到 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, "&").replace(/</g, "<").replace(/>/g, ">");
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"