2016-10-02 1 views
0

Итак, я прочитал все другие вопросы SO относительно этого, но похоже, что все должно быть правильно настроено. Я запускаю самодостаточное консольное приложение SignalR, в котором есть одно пустое объявление Hub (это для односторонней связи с сервером на подключенные клиенты).SignalR не вызывает методы клиента

EDIT: Ссылки на проект, который воспроизводит проблему - https://dl.dropboxusercontent.com/u/66477739/SignalRTest.zip

Демонстрационное решение имеет 3-х проекты:

  • SignalRTest.BusinessLogic - Простое консольное приложение, которое просто публикует сообщение каждые 10 секунд. Эти сообщения никогда не принимаются клиентом. Это моделирует мой уровень бизнес-логики, нажимая уведомления на подключенные клиенты.
  • SignalRTest.SelfHost - Самостоятельное приложение SignalR + концентратор. Я добавил метод «Отправить» в концентратор, чтобы показать, что все работает, когда клиент вызывает server.send('message');, но он не работает, когда сервер инициирует сообщение. Ввод в этом окне консоли и нажатие Enter отправит этот текст в веб-приложение. ЭТО РАБОТАЕТ!
  • SignalRTest.UI - Просто пустое приложение MVC с одной страницей, на которой загружаются необходимые сценарии. Успешно полученное сообщение будет просто выводить консольный вывод, в этом примере никогда не будет изменений пользовательского интерфейса.

PublishStatusHub.cs

public class PublishStatusHub : Hub 
{ 
} 

JS

$(document).ready(function() { 
    $.connection.hub.url = "http://localhost:8080/signalr"; 

    var publish = $.connection.publishStatusHub; 

    publish.client.addMessage = function (message) { 
     console.log(message); 
    }; 

    $.connection.hub.start().done(function() { }); 
}); 

Вызов кода из отдельного узла

var context = GlobalHost.ConnectionManager.GetHubContext<PublishStatusHub>(); 
context.Clients.All.addMessage("Starting publish..."); 

Хотя я вижу, что приведенный выше код выполняется (через точки останова), клиентский метод никогда не вызывается.

Я включил регистрацию SignalR и никаких исключений не выбрасывают. Кроме того, он никогда не регистрирует входящие сообщения.

Интересно, что я могу получить сообщения, отправленные клиенту через мой метод Main() в Program.cs в самопринятом консольном приложении:

Program.cs

static void Main(string[] args) 
{ 
    string url = "http://localhost:8080"; 
    using (WebApp.Start(url)) 
    { 
     Console.WriteLine("Server running on {0}", url); 

     while (true) 
     { 
      string message = Console.ReadLine(); 

      IHubContext hubContext = GlobalHost.ConnectionManager.GetHubContext<PublishStatusHub>(); 
      hubContext.Clients.All.addMessage(message); 
     } 
    } 
} 

сейчас , если я нахожу в окне консоли и нажимаю enter, сообщение отправляется клиенту успешно и оно регистрируется в окне вывода консоли.

ОДНАКО, если перенести этот код в другой файл в том же консольном приложении, а затем вызвать его из другой сборки (что является конечной целью), он молча снова терпит неудачу:

MessagePublisher.CS

public class MessagePublisher 
{ 
    public void Publish(string message) 
    { 
     IHubContext hubContext = GlobalHost.ConnectionManager.GetHubContext<PublishStatusHub>(); 
     hubContext.Clients.All.addMessage(message); 
    } 
} 

Вызов кода из отдельного узла

var messagePublisher = new MessagePublisher(); 
messagePublisher.Publish("Test message"); 

я застрял на том, почему я не могу публиковать сообщения для подключенных клиентов из внешних сборок.

+0

Так вы настроите ваш signlarR сервер в консольном приложении, а затем попытаться опубликовать сообщение от другого узла (пока еще работает же консольное приложение) и это не удается? – Evk

+0

Да, это правильно. – Scott

+0

Возможно, у вас есть минимальный проект VS, который воспроизводит это? – Evk

ответ

2

В проекте, который вы опубликовали, вы пытаетесь опубликовать сообщение из совершенно другого консольного приложения (SignalRTest.BusinessLogic). Это приложение не поддерживает службу SignalR, поэтому не имеет понятия о подключенных клиентах. Все клиенты подключены к сервису, размещенному другим приложением (SinglaRTest.SelfHost) в другом процессе. Таким образом, нет способа, как это может сработать. Если вы начнете свою услугу в приложении BusinessLogic, это будет работать как обычно.

+0

Проект BusinessLogic вызывает MessagePublisher.Publish(), который существует в проекте SelfHost (и, в свою очередь, пытается передать сообщения подключенным клиентам - из SelfHost). В классе BusinessLogic нет кода, который имеет какое-либо отношение к SignalR. Я правильно понимаю ваши проблемы? – Scott

+0

Ваш BusinessModel - это консольное приложение, которое вы запускаете. Да, он ссылается на SelfHost, но он не запускает SignalR, так почему он должен иметь возможность публиковать что-нибудь? Не запускайте BusinessLogic в качестве консольного приложения, вместо этого ссылайтесь на него с хоста. – Evk

+0

Чтобы уточнить, обрабатывать только то, что хост signalr может публиковать сообщения для клиентов, вы не можете сделать это из других процессов – Evk

0

Я предполагаю, что вы создали конструктор, вы можете удалить его ...

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

  • Нет связанных вопросов^_^