Итак, я прочитал все другие вопросы 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");
я застрял на том, почему я не могу публиковать сообщения для подключенных клиентов из внешних сборок.
Так вы настроите ваш signlarR сервер в консольном приложении, а затем попытаться опубликовать сообщение от другого узла (пока еще работает же консольное приложение) и это не удается? – Evk
Да, это правильно. – Scott
Возможно, у вас есть минимальный проект VS, который воспроизводит это? – Evk