Тестовый проект Signalr не работает должным образом

Я пытаюсь создать простой тестовый проект SignalR; однако он ведет себя не так, как я считаю, что должен. У меня есть веб-сайт со следующим кодом:

namespace SignalRTest3
{    
    public class MyHub1 : Hub
    {
        public void Hello(string message)
        {
            Clients.All.Hello();
            
        }
    }
}

Запуск.cs:

[assembly: OwinStartupAttribute(typeof(SignalRTest3.Startup))]
namespace SignalRTest3
{
    public partial class Startup
    {
        public void Configuration(IAppBuilder app)
        {
            ConfigureAuth(app);

            app.UseCors(CorsOptions.AllowAll);
            app.MapSignalR();
        }
    }
}

Я изменил страницу индекса:

<body>
    <!-- HTML Content -->

    <script type="text/javascript" src="~/Scripts/jquery-1.10.2.min.js"></script>
    <script type="text/javascript" src="~/Scripts/jquery.signalR-2.1.2.min.js"></script>
    <script type="text/javascript" src="~/signalr/hubs"></script>
    <script type="text/javascript" src="~/Scripts/SignalRTest.js"></script>
    <div class="jumbotron">
        <h1>SignalR Test</h1>
    </div>
</body>

И упомянутый выше файл JS:

$(function () {
    // Declare a proxy to reference the hub. 
    var hub = $.connection.MyHub1;

    // Create a function that the hub can call to broadcast messages.
    hub.client.Hello = function (message) {

        alert(message);
    };

    hub.start();
});

Итак, цель состоит в том, чтобы при получении уведомления сайт отображал предупреждение. Чтобы вызвать это, у меня есть консольное приложение:

class Program
{
    static void Main(string[] args)
    {
        Console.Write("Message: ");
        string message = Console.ReadLine();

        HubConnection connection = new HubConnection("http://localhost:4035/");
        IHubProxy hub = connection.CreateHubProxy("MyHub1");
        connection.Start().Wait();
        hub.Invoke<string>("Hello", message).Wait();            
    }
}

Итак, я набираю сообщение и вижу, что код в хабе срабатывает, но похоже, что что-то не так с проводкой между javascript и хабом; пожалуйста, может кто-нибудь указать мне в правильном направлении?

РЕДАКТИРОВАТЬ: изменить сигнатуры методов и hub.start в соответствии с предложением JPThorne

РЕДАКТИРОВАТЬ: пытался использовать CORS, но безрезультатно

Похоже проблема может быть с прокси; Я получаю следующий вывод в окне консоли F12:

Uncaught TypeError: Cannot read property 'MyHub1' of undefined
    at HTMLDocument.<anonymous> (VM456 SignalRTest.js:3)
    at c (jquery-1.10.2.min.js:21)
    at Object.fireWith [as resolveWith] (jquery-1.10.2.min.js:21)
    at Function.ready (jquery-1.10.2.min.js:21)
    at HTMLDocument.q (jquery-1.10.2.min.js:21) (anonymous) @ VM456 SignalRTest.js:3 c @ jquery-1.10.2.min.js:21 fireWith @ jquery-1.10.2.min.js:21 ready @ jquery-1.10.2.min.js:21 q @ jquery-1.10.2.min.js:21

ОБНОВИТЬ:

Благодаря помощи JPThorne я наконец отследил его до файла BundleConfig; моя выглядела так:

bundles.Add(new ScriptBundle("~/bundles/jquery").Include(
            "~/Scripts/jquery-{version}.js"));

bundles.Add(new ScriptBundle("~/bundles/jqueryval").Include(
            "~/Scripts/jquery.validate*"));
// Use the development version of Modernizr to develop with and learn from. Then, when you're
// ready for production, use the build tool at http://modernizr.com to pick only the tests you need.
bundles.Add(new ScriptBundle("~/bundles/modernizr").Include(
            "~/Scripts/modernizr-*"));

bundles.Add(new ScriptBundle("~/bundles/bootstrap").Include(
          "~/Scripts/bootstrap.js",
          "~/Scripts/respond.js"));

bundles.Add(new StyleBundle("~/Content/css").Include(
          "~/Content/bootstrap.css",
          "~/Content/site.css"));

Насколько я могу судить, регулярное выражение, используемое для {version} в ~/Scripts/jquery-{version}.js, также слишком рано подхватывало сценарии SignalR!


person Paul Michaels    schedule 08.02.2017    source источник
comment
Быстрый вопрос: оба эти кода находятся в одном и том же проекте или в двух разных проектах, потому что IMO один кажется консольным приложением, а другой - веб-приложением. Это правильно?   -  person Suprabhat Biswal    schedule 08.02.2017
comment
Да - отдельные приложения. Консольное приложение для отправки сообщения и веб-приложение для его отображения.   -  person Paul Michaels    schedule 08.02.2017
comment
Важно, чтобы вы также разрешили CORS. См. docs.microsoft.com/en-us/aspnet/signalr/overview/   -  person Stephu    schedule 08.02.2017
comment
Я думал, что CORS актуален только тогда, когда вы переходите на междоменный домен?   -  person Paul Michaels    schedule 08.02.2017
comment
@Tester уже упомянул в своем комментарии, что нужно включить CORS, чтобы вы могли отправлять сообщения из консольного приложения в веб-приложение. Поскольку вы находитесь на этапе разработки, а у проекта другой номер порта, вам придется внедрить CORS в ваше текущее приложение. Если вы планируете размещать их в одном домене (я предполагаю, что вы это сделаете), то CORS не нужно продолжать с тем, что вы работаете, и тестировать их на LIVE сайте.   -  person Suprabhat Biswal    schedule 09.02.2017
comment
Я пробовал использовать CORS (см. отредактированный вопрос). Я не совсем уверен, что имелось в виду под LIVE-сайтом по отношению к консольному приложению, но я пробовал как разместить его в IIS как веб-сайт, так и установить порт на 80; ни то, ни другое не имело значения.   -  person Paul Michaels    schedule 09.02.2017


Ответы (1)


Также нужно запустить хаб на стороне клиента. Ну, это то, что работает для нас. Вы можете попробовать это:

$.connection.hub
    .start()
    .done(function() { console.log("Hub started"); })
    .fail(function() { console.log("Error: could not connect"); });

Кроме того, мне пригодились следующие слушатели:

$.connection.hub.connectionSlow(function() {
    console.log("We are currently experiencing difficulties with the connection.");
});

$.connection.hub.error(function (error) {
    console.log("SignalR error: ", error);
});

ОБНОВЛЕНИЕ №1: я бы изменил Clients.All.hello(); на вашем сервере на Clients.All.hello(message);

а потом на FE меняем hub.client.Hello = function (name, message) на hub.client.Hello = function (message)

ОБНОВЛЕНИЕ № 2: добавлено: [HubName("MyHub1")] выше public class MyHub1 : Hub

ОБНОВЛЕНИЕ №3:

Итак, я попробовал вашу версию, и на самом деле есть несколько проблем.

  1. Не вызывайте start так: hub.start(); называйте так: $.connection.hub.start();
  2. Возможно, вы захотите перейти на последнюю версию jquery.
  3. Убедитесь, что вы ссылаетесь на jquery выше вашего SignalRTest.js - вот почему вы получаете эту ошибку «невозможно прочитать свойство неопределенного» выше.
person JPThorne    schedule 08.02.2017
comment
Может показаться, что, хотя это может быть правильно, это не весь ответ (предупреждение все еще не получено). - person Paul Michaels; 08.02.2017
comment
Итак, снова взглянув на ваш код, я вижу: public void Hello (строковое сообщение) и hub.client.Hello = function (name, message) { так что... вы не используете первое строковое сообщение — вы не пропуская его. А во внешнем скрипте у вас есть дополнительный параметр имени. Проверьте мой обновленный ответ. Параметры должны совпадать. - person JPThorne; 08.02.2017
comment
Пробовал это. Я даже пробовал играть с случаем метода (Hello/hello), но не в кости. - person Paul Michaels; 08.02.2017
comment
@pm_2 да, так что, как упоминали выше комментаторы, вам также, вероятно, потребуется включить cors. В моем решении у меня есть концентратор в библиотеке классов, на который затем ссылается мой веб-проект, в котором есть FE js. Вы также можете попробовать сделать это. - person JPThorne; 09.02.2017
comment
Я попытался включить CORS (как описано выше). Извините, я не уверен, что такое FE js? - person Paul Michaels; 09.02.2017
comment
Извините, это интерфейс Javascript. Пробовали ли вы использовать концентратор в веб-проекте в качестве ссылки на библиотеку классов? Или сразу в проекте? - person JPThorne; 09.02.2017
comment
Класс хаба находится внутри веб-проекта - person Paul Michaels; 10.02.2017
comment
@pm_2 снова обновил ответ. У меня есть рабочая версия, которую я могу отправить вам, если хотите? - person JPThorne; 10.02.2017
comment
JQuery упоминается выше signalrtest.js - хотя теперь вы это сказали, мне интересно, говорим ли мы об одном и том же, когда говорим выше. Я упредил изменение концентратора на $.connection... и это не имело значения. Я также обновил JQuery до 3.1.1, но все безрезультатно. - person Paul Michaels; 10.02.2017
comment
Спасибо - я рад принять рабочую версию: таким образом я могу определить разницу и обновить вопрос с любой глупой вещью, которую я пропустил. - person Paul Michaels; 10.02.2017
comment
@pm_2 правильно, да, на данный момент это явно что-то очень маленькое, что не так. Вот ссылка на zip в Dropbox: dropbox.com/s /upo8ks30txjd6c2/SignalRTest.zip?dl=0# надеюсь, вам это поможет. Соответствующие файлы: Program.cs в консольном проекте; MyHub1, Startup, BundleConfig, SignalRTest.js и _Layout.cshtml в веб-проекте. Я запускаю веб-проект, отключаю отладчик и запускаю консольное приложение. - person JPThorne; 11.02.2017
comment
Большое спасибо за это - я наконец-то докопался до сути (обновление вопроса, чтобы указать на оскорбительную строку) - person Paul Michaels; 12.02.2017
comment
Рад, что мы наконец разобрались! - person JPThorne; 12.02.2017