В вашем startup.cs
вы должны зарегистрировать службу signalR и подключить свой концентратор к каналу http-запросов, если вы этого еще не сделали.
Шаг 1
startup.cs --> ConfigureServices()
необходимо зарегистрировать службу signalR, например:
services.AddSignalR();
startup.cs --> Configure()
должно содержать ваши сопоставления, например:
app.UseSignalR(routes =>
{
routes.MapHub<YourHubClass>("/hub/test1");
routes.MapHub<YourHubClass2>("/hub/test2");
});
При необходимости можно добавить дополнительные параметры. Но я полагаю, что значения по умолчанию на данный момент достаточно хороши.
Шаг 2
Ваш класс-концентратор может просто наследоваться от: Hub для проверки работоспособности. Но чтобы показать какой-то общий вывод, вы можете переопределить виртуальные функции Hub следующим образом:
public class YourHubClass: Hub
{
public override async Task OnConnectedAsync()
{
Console.WriteLine(Context.ConnectionId);
await base.OnConnectedAsync();
}
public override async Task OnDisconnectedAsync(Exception ex)
{
Console.WriteLine(Context.ConnectionId);
await base.OnDisconnectedAsync(ex);
}
}
Шаг 3
В зависимости от того, когда / где в вашем внутреннем коде вы хотите уведомить всех клиентов(или определенных клиентов), которые слушают ваш концентратор, вы можете просто передать данные, которые вы хотите передать, выполнив что-то вроде этого.
var test1data = GetTest1Data();
await _hub.Clients.All.SendAsync("test1", test1data);
var test2data = GetTest1Data();
await _hub.Clients.All.SendAsync("test2", test2data);
Где _hub
- зависимость, введенная в этой области. Просто чтобы уточнить, что:
private readonly IHubContext<YourHubClass> _hub;
public YourScopedConstructor(IHubContext<YourHubClass> hub)
{
_hub = hub ?? throw new ArgumentNullException(nameof(hub));
}
Шаг 4
Теперь вы можете подключиться и прослушать свой концентратор. Например:
public yourSubscribableSubject: BehaviorSubject<any> = new BehaviorSubject<any>(null);
private _baseUrl: string = "your base url";
private _frontendHubConnection: HubConnection;
this._frontendHubConnection = new HubConnectionBuilder()
.withUrl(`${this._baseUrl}/hub/test1`) // or hub/test2
.configureLogging(LogLevel.Information)
.build();
this._frontendHubConnection
.start()
.then(() => console.log('SignalR - init'))
.catch(err => console.log('Error while starting connection: ' + err));
this._frontendHubConnection.on('test1', (data: any) => {
console.log(data);
this.yourSubscribableSubject.next(data);
});
И для любого другого компонента, чтобы получить данные, просто подпишитесь на yourSubscribableSubject
. Надеюсь, это поможет.
Кроме того, если вы хотите инициировать отправку данных с сервера на клиенты с конечной точки API, просто переместите код области действия, который я предложил, начиная с шага 3.
public async Task<ActionResult> YourApiRoute()
{
try
{
var test1data = GetTest1Data();
await _hub.Clients.All.SendAsync("test1", test1data);
return Ok();
}
catch (Exception e)
{
Console.WriteLine(e.Message);
return StatusCode(StatusCodes.Status500InternalServerError);
}
}