Я просто потратил два дня, пытаясь понять то же самое. Я наконец заставил его работать, и вот несколько вещей, которые мне пришлось сделать:
1) Вы заметили, что использование пакета @aspnet/signalr
было некорректно для .Net framework, и это правильно. Вам нужен пакет signalr
(npm install signalr
).
2) Это самая важная часть всего процесса. SignalR
зависит от jQuery
. У вас есть для включения jQuery до , включая скрипт-сигнализатор. В файле angular.json
в разделе scripts
необходимо указать:
"./node_modules/jquery/dist/jquery.js",
"./node_modules/signalr/jquery.signalR.js"
в этом точном порядке. При запуске вашего проекта он сначала загрузит jQuery, а затем скрипт signalR.
Многие другие потоки стековых ответов отвечают на вопрос в ответ на эту ошибку:
jQuery was not found. Please ensure jQuery is referenced before the SignalR client JavaScript file
говорит вам написать import * as $ from "jquery"
в компоненте, в котором вы хотите использовать jQuery. Однако, НЕ правильно сделать это. Причина в том, что согласно этой угловой статье о глобальных сценариях , использование синтаксиса import
включит его в нагрузку module
и поместит в файл vendor.js
, созданный при запуске ng build
команда. Причина в том, что проблема заключается в том, что сначала jQuery будет загружен из вашего angular.json, затем будет загружен signalR, затем модуль из vendor.js перезапустит jQuery и отсоединит все события, которые были только что присоединены к jQuery из signalR.
3) Поскольку вы заметили, что используете версию сигнализатора .Net Core, у вас не будет доступа к HubConnectionBuilder
при попытке создания нового HubConnection в вашем угловом компоненте.
Вместо этого, когда исполняется скрипт сигнализатора, он присоединяет дополнительные события к $
в вашем коде. Примечание: если вы получаете ошибки при сборке или во время компиляции из ваших файлов ts, убедитесь, что вы включили @types/signalr
и @types/jquery
из npm
Чтобы установить новое соединение с концентратором, используйте $.hubConnection("your-url-here/signalr")
. Он будет подключен к концентратору вашего сервера при запуске. Примечание: Я сохранил результат этого как переменную с именем hubConnection
в моем угловом компоненте
В коде вашего сервера (файл .cs), где у вас есть класс Hub, вам нужно будет добавить над именем класса: [HubName("YourHubName")]
. Так что в вашем случае ваш файл .cs будет выглядеть примерно так:
[HubName("Broadcast")]
public class BroadcastHub : Hub
Скорее всего, вам придется включить это в начало вашего файла .cs:
using Microsoft.AspNet.SignalR.Hubs;
Затем в вашем Angular Component вы настраиваете прокси для подключения к этому хабу на вашем сервере.
В следующей строке после создания нового hubConnection напишите:
this.hubConnection.createHubProxy("yourHubName");
.
В вашем случае this.hubConnection.createHubProxy("broadcast");
После того, как вы создали свой прокси, вы можете присоединить слушателей для прослушивания событий, исходящих от сервера, или вы можете вызывать функции сервера из ваших угловых компонентов.
Я следовал этому примеру здесь, чтобы узнать, как настроить вызовы и прослушивание событий сервера. Да, это angular 2, но функции из signalr все еще работают одинаково в моем приложении angular 7.
Краткий ответ: используйте от proxy.on('eventname')
до прослушивания событий с сервера и используйте функции proxy.invoke('eventname')
до вызова на вашем хабе из ваших угловых компонентов.
Наконец, несколько заметок в ваших файлах cs. В моем Startup.cs единственное, что у меня есть для отображения сигнализатора, это app.MapSignalR()
. Я не стал вдаваться в подробности, касающиеся установки других свойств, как вы сделали, но это может быть еще одной причиной некоторых проблем?