Signalr signar与WebApi的结合

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

我正在为信号员做概念证明。基本上我遵循了这个网站的教程:我正在尝试从另一个项目中的WebApi向前端发送消息

javascript代码如下所示:

$(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>:&nbsp;&nbsp;' + 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);
    }
}