2016-12-05 2 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 по этой ссылке/port: http://localhost:8387/api/values

Я чувствую, что мне не хватает одной последней вещи, но многочисленные результаты Google не могли мне помочь. Кто-нибудь знает, как я могу это исправить?

+0

IHandleMessages - концепция nservicebus? Итак, второй мир кода, расположенный в * том же приложении приложения, что ваш концентратор? Если вы хотите, чтобы 'ChatHub' был доступен в нескольких экземплярах приложения, вы должны использовать объединительную плату signalr. –

+0

@IgorLizunov IHandleMessages - действительно концепция NServiceBus. Первые два блока кода находятся на одном экземпляре приложения, а последний блок кода - на другом экземпляре приложения. Вы имеете в виду это с объединительной панелью signalr? https://www.asp.net/signalr/overview/performance/scaleout-in-signalr – pmulders

ответ

1

Как мы изложили в комментариях, у вас есть два экземпляра приложения на стороне сервера.

Ваш концентратор в одном экземпляре: public class ChatHub : Hub. И этот звонок находится в другом: GlobalHost.ConnectionManager.GetHubContext<ChatHub>();.

Таким образом, второй экземпляр концентратора не является экземпляром концентратора с подключенными клиентами.

Для решения этой проблемы необходимо настроить backplane для signalr. Он позволяет использовать один и тот же концентратор в разных экземплярах сервера. Я рекомендую использовать опцию SQL server вместо Azure/Redis.

Другим решением является остановка использования серверного концентратора во втором экземпляре. И используйте клиентский код C# signalR для подключения к первому экземпляру (и концентратору).

+0

Я решил свою проблему, выполнив вашу ссылку. Мне не удалось заставить его работать с SQL-сервером, но я получил его работу с реализацией Azure Service Bus. Спасибо @ igor-lizunov – pmulders

Смежные вопросы