Отправить сообщение на определенную вкладку браузера (клиент) с помощью SignalR - Angular - PullRequest
1 голос
/ 07 октября 2019

Я использую этот фрагмент кода Web API C # .Net Core для отправки сообщения с сервера на клиент:

public class Test : ITest
{
    private IHubContext<NotificationHub, ITest> _hub;

    public Test(IHubContext<NotificationHub, ITest> hub)
    {
        _hub = hub;
    }

    public async Task BroadcastMessage(string Type, string Payload)
    {
        await _hub.Clients.All.BroadcastMessage(Type, Payload);
    }
}

Но он отправит сообщение всем клиентам, но мне нужно только отправитьсообщение на открытую вкладку (клиент), которая выполняет веб-API. Что я должен сделать, чтобы сделать такую ​​вещь?

А вот угловые коды:

import * as signalR from '@aspnet/signalr';
import { Component, OnInit } from '@angular/core';
import { MessageService } from 'primeng/components/common/messageservice';
import { LogState, ActivityLogType, ContentSearcherResult } from 'src/Model/StartContentSearcher';
import { PropertyRead } from '@angular/compiler';

@Component({
  selector: 'app-root',
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.css']
})

export class AppComponent implements OnInit {
  constructor(private messageService: MessageService) { }

  private connection: signalR.HubConnection;

  connect(accessToken) {
    if (!this.connection) {
      this.connection = new signalR.HubConnectionBuilder()
        .withUrl("http://localhost:8178/contentsearcherHub", { accessTokenFactory: () => accessToken }).build();

      this.connection.start().catch(err => console.error(err))
      this.connection.on("BroadcastMessage", (Type, Payload) => { console.log(Type, Payload) })
    }
  }

  ngOnInit(): void {
    this.connect("3076a225-f2f6-4c68-b894-08accb62bb90");

  }

  uuidv4() {
    return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) {
      var r = Math.random() * 16 | 0, v = c == 'x' ? r : (r & 0x3 | 0x8);
      return v.toString(16);
    });
  }

}

Ответы [ 2 ]

0 голосов
/ 14 октября 2019

У меня есть проект Angular, и я использую Signalr внутри него. Но когда я получаю идентификатор соединения, я могу распечатать его. Но я не могу назначить его в глобальной переменной. Это мой код:

connection = new signalR.HubConnectionBuilder().withUrl("http://localhost:8178/notifyHub").build();
connection.start().then(function () {
  connection.invoke("GetConnectionId").then(function (connectionId) {
   console.log(connectionId);
   // var temp=connectionId
  })
}).catch(err => console.error(err));
0 голосов
/ 08 октября 2019

Мне нужно только отправить сообщение на открытую вкладку (клиент), которая выполняет веб-API. Что я должен сделать, чтобы сделать такую ​​вещь?

После того, как клиент установил / установил соединение с хаб-сервером, мы можем получить идентификатор соединения текущего подключенного клиента. Чтобы передать сообщение только тому конкретному клиенту, который использует API, вы можете изменить и передать идентификаторы соединения методу BroadcastMessage, как показано ниже.

public async Task BroadcastMessage(string connectionId, string Type, string Payload)
{
    await _hub.Clients.Client(connectionId).BroadcastMessage(Type, Payload);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...