2016-12-05 48 views
0

我正在为SignalR做一个概念验证。基本上我遵循这个网站上的教程:https://www.asp.net/signalr/overview/getting-started/tutorial-getting-started-with-signalr,我试图从一个WebApi在不同的项目中发送消息到前端。SignalR结合WebApi

的JavaScript代码如下:

$(function() { 
     // Declare a proxy to reference the hub. 
     var chat = $.connection.chatHub; 
     console.log("stuff"); 
     // 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>'); 
     }; 
     // Get the user name and store it to prepend to messages. 
     $('#displayname').val(prompt('Enter your name:', '')); 
     // Set initial focus to message input box. 
     $('#message').focus(); 
     // 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 ChatHub : Hub 
{ 
    public void Send(string name, string message) 
    { 
     // Call the broadcastMessage method to update clients. 
     Clients.All.broadcastMessage(name, message); 
    } 
} 

当我建立这个它的工作原理就像在上面的链接的例子的代码。然而,当我试图从下面的代码另一个项目发送消息,它不会工作:

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); 
    } 
} 

当我运行这段代码的前端被此链接/端口上运行:http://localhost:8854/index.html和的WebAPI此链接/端口:http://localhost:8387/api/values

我觉得我错过了最后一件事,但许多谷歌的结果不能帮助我。有谁知道我该如何解决这个问题?

+0

IHandleMessages是一个nservicebus概念正确吗? 因此,位于* hub *应用程序实例的代码的第二次和平是否如此? 如果您希望'ChatHub'在多个应用程序实例中可用,那么您应该使用signalr背板。 –

+0

@IgorLizunov IHandleMessages确实是一个NServiceBus概念。前两个代码块位于一个应用程序实例上,最后一个代码块位于不同的应用程序实例上。你的意思是信号背板吗? https://www.asp.net/signalr/overview/performance/scaleout-in-signalr – pmulders

回答

1

正如我们从评论中概述的那样,您在服务器端有两个应用程序实例。

您的集线器在一个实例中:public class ChatHub : Hub。 这个电话是在另一个:GlobalHost.ConnectionManager.GetHubContext<ChatHub>();

所以第二个集线器实例并不等于连接客户端的集线器实例。

要解决此问题,您需要为signalr配置backplane。它允许在服务器的不同实例中使用相同的集线器。我建议使用SQL服务器选项而不是Azure/Redis。

另一种解决方案是在第二种情况下停止使用服务器端集线器。并使用客户端C#signalR代码连接到第一个实例(和集线器)。

+0

我通过以下链接解决了我的问题。我无法使用SQL服务器,但我使用Azure Service Bus实现。谢谢@ igor-lizunov – pmulders