Nano Hash - криптовалюты, майнинг, программирование

SignalR не вызывает клиентские методы

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

РЕДАКТИРОВАТЬ: Ссылка на проект, в котором воспроизводится проблема - https://dl.dropboxusercontent.com/u/66477739/SignalRTest.zip

В демонстрационном решении 3 проекта:

  • SignalRTest.BusinessLogic - Простое консольное приложение, которое публикует сообщение каждые 10 секунд. Эти сообщения никогда не принимаются клиентом. Это имитирует мой уровень бизнес-логики, отправляющий уведомления подключенным клиентам.
  • SignalRTest.SelfHost - автономное приложение SignalR + концентратор. Я добавил к концентратору метод «Отправить» только для того, чтобы показать, что все работает, когда клиент вызывает server.send('message');, но не работает, когда сервер инициирует сообщение. Если ввести в этом окне консоли и нажать клавишу ВВОД, этот текст будет отправлен в веб-приложение. ЭТО РАБОТАЕТ!
  • 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");

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

02.10.2016

  • Итак, вы настраиваете свой сервер signlarR в консольном приложении, а затем пытаетесь опубликовать сообщение из другой сборки (при этом все еще работает то же консольное приложение), и это не удается? 02.10.2016
  • Да, это правильно. 02.10.2016
  • Может быть, у вас есть минимальный проект VS, который воспроизводит это? 02.10.2016
  • @Evk - Добавлен образец проекта. 02.10.2016

Ответы:


1

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

02.10.2016
  • Проект BusinessLogic вызывает MessagePublisher.Publish (), который существует в проекте SelfHost (и, в свою очередь, пытается отправлять сообщения подключенным клиентам - из SelfHost). В классе BusinessLogic нет кода, который имел бы какое-либо отношение к SignalR. Правильно ли я понимаю ваши опасения? 02.10.2016
  • Ваша BusinessModel - это консольное приложение, которое вы запускаете. Да, он ссылается на SelfHost, но не запускает SignalR, так почему он должен иметь возможность публиковать что-либо? Не запускайте BusinessLogic как консольное приложение, вместо этого ссылайтесь на него с хоста. 02.10.2016
  • Чтобы прояснить больше, только процесс, на котором размещен сигнал, может публиковать сообщения для клиентов, вы не можете делать это из других процессов. 03.10.2016
  • @ Скотт, ты все-таки понял, в чем проблема? Если нет - могу попытаться объяснить как-нибудь по-другому. 03.10.2016

  • 2

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

    07.12.2016
    Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..