Signalr signar与WebApi的结合
我正在为信号员做概念证明。基本上我遵循了这个网站的教程:我正在尝试从另一个项目中的WebApi向前端发送消息 javascript代码如下所示:Signalr signar与WebApi的结合,signalr,signalr-hub,Signalr,Signalr Hub,我正在为信号员做概念证明。基本上我遵循了这个网站的教程:我正在尝试从另一个项目中的WebApi向前端发送消息 javascript代码如下所示: $(function () { // Declare a proxy to reference the hub. var chat = $.connection.chatHub; // Create a function that the hub can call to broadcast message
$(function () {
// Declare a proxy to reference the hub.
var chat = $.connection.chatHub;
// Create a function that the hub can call to broadcast messages.
chat.client.broadcastMessage = function (name, message) {
// Html encode display name and message.
var encodedName = $('<div />').text(name).html();
var encodedMsg = $('<div />').text(message).html();
// Add the message to the page.
$('#discussion').append('<li><strong>' + encodedName
+ '</strong>: ' + encodedMsg + '</li>');
};
// Start the connection.
$.connection.hub.start().done(function () {
$('#sendmessage').click(function () {
// Call the Send method on the hub.
chat.server.send($('#displayname').val(), $('#message').val());
// Clear text box and reset focus for next comment.
$('#message').val('').focus();
});
});
});
当我构建这段代码时,它的工作原理与上面链接中的示例一样。但是,当我尝试使用以下代码从另一个项目发送消息时,它将无法工作:
public class MyMessageHandler : IHandleMessages<MyMessage>
{
static ILog log = LogManager.GetLogger<MyMessageHandler>();
public Task Handle(MyMessage message, IMessageHandlerContext context)
{
log.Info($"Message received: {message.Name}");
var hub = GlobalHost.ConnectionManager.GetHubContext<ChatHub>();
hub.Clients.All.Send("Admin", "stop the chat");
return Task.Delay(0);
}
}
公共类MyMessageHandler:IHandleMessages
{
静态ILog log=LogManager.GetLogger();
公共任务句柄(MyMessage消息、IMessageHandlerContext上下文)
{
log.Info($“收到的邮件:{Message.Name}”);
var hub=GlobalHost.ConnectionManager.GetHubContext();
hub.Clients.All.Send(“Admin”,“停止聊天”);
返回任务。延迟(0);
}
}
当我运行此代码时,前端正在该链接/端口上运行:http://localhost:8854/index.html
和此链接/端口上的webapi:http://localhost:8387/api/values
我觉得我错过了最后一件事,但无数的谷歌搜索结果帮不了我。有人知道我如何解决这个问题吗?正如我们在评论中概述的,服务器端有两个应用程序实例 您的中心位于一个实例中:
公共类ChatHub:hub
。
这个调用位于另一个:GlobalHost.ConnectionManager.GetHubContext()代码>
所以第二个集线器实例并不等于连接了客户端的集线器实例
要解决此问题,您需要配置signalr。它允许在服务器的不同实例中使用相同的集线器。我建议使用SQL server选项而不是Azure/Redis
另一个解决方案是在第二个实例中停止使用服务器端集线器。并使用客户端C#信号器代码连接到第一个实例(和集线器)。正如我们在评论中概述的,服务器端有两个应用程序实例
您的中心位于一个实例中:公共类ChatHub:hub
。
这个调用位于另一个:GlobalHost.ConnectionManager.GetHubContext()代码>
所以第二个集线器实例并不等于连接了客户端的集线器实例
要解决此问题,您需要配置signalr。它允许在服务器的不同实例中使用相同的集线器。我建议使用SQL server选项而不是Azure/Redis
另一个解决方案是在第二个实例中停止使用服务器端集线器。并使用客户端C#信号器代码连接到第一个实例(和集线器)。IHandleMessages是一个nservicebus概念,对吗?那么,代码的第二次和平是否位于您的中心所在的同一个应用程序实例中?如果您想在多个应用程序实例中使用ChatHub
,那么您应该使用signalr背板。@IgorLizunov IHandleMessages确实是一个NServiceBus概念。前两个代码块位于一个应用程序实例上,最后一个代码块位于不同的应用程序实例上。你是说信号机背板?IHandleMessages是一个nservicebus概念,对吗?那么,代码的第二次和平是否位于您的中心所在的同一个应用程序实例中?如果您想在多个应用程序实例中使用ChatHub
,那么您应该使用signalr背板。@IgorLizunov IHandleMessages确实是一个NServiceBus概念。前两个代码块位于一个应用程序实例上,最后一个代码块位于不同的应用程序实例上。你是说信号机背板?我通过跟踪你的链接解决了我的问题。我无法让它与SQL server一起工作,但我让它与Azure服务总线实现一起工作。谢谢@igor lizunovI通过您的链接解决了我的问题。我无法让它与SQL server一起工作,但我让它与Azure服务总线实现一起工作。谢谢你@igor lizunov
public class MyMessageHandler : IHandleMessages<MyMessage>
{
static ILog log = LogManager.GetLogger<MyMessageHandler>();
public Task Handle(MyMessage message, IMessageHandlerContext context)
{
log.Info($"Message received: {message.Name}");
var hub = GlobalHost.ConnectionManager.GetHubContext<ChatHub>();
hub.Clients.All.Send("Admin", "stop the chat");
return Task.Delay(0);
}
}