Signal-R Вызов другого метода сервера после получения данных предыдущего вызова - PullRequest
0 голосов
/ 09 октября 2019

Я просто читаю учебник Microsoft по Signal-R и хочу использовать его вместо Ajax в .Net Core. Учитывая следующий код от Microsoft, есть ли какой-нибудь способ, которым мы можем сделать другой серверный вызов после получения данных отпервый вызов в функции broadcastMessage (которая определена как функция javascript)?

<script type="text/javascript">
    $(function () {
        // Declare a proxy to reference the hub. 
        var chat = $.connection.chatHub;
        // Create a function that the hub can call to broadcast messages.
        chat.client.broadcastMessage = function (name, message) {
            // Html encode display name and message. 
            var encodedName = $('<div />').text(name).html();
            var encodedMsg = $('<div />').text(message).html();
            // Add the message to the page. 
            $('#discussion').append('<li><strong>' + encodedName
                + '</strong>:&nbsp;&nbsp;' + encodedMsg + '</li>');
        };
        // Get the user name and store it to prepend to messages.
        $('#displayname').val(prompt('Enter your name:', ''));
        // Set initial focus to message input box.  
        $('#message').focus();
        // Start the connection.
        $.connection.hub.start().done(function () {
            $('#sendmessage').click(function () {
                // Call the Send method on the hub. 
                chat.server.send($('#displayname').val(), $('#message').val());
                // Clear text box and reset focus for next comment. 
                $('#message').val('').focus();
            });
        });
    });
</script>

, чтобы мы могли проверить полученные данные и условно инициировать другой вызов. Или, если все вызовы сервера должны быть помещены в $ .connection.hub.start (). Done (function () {?

1 Ответ

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

Вы можете вызывать другие методы после получения сообщения следующим образом:

Пример машинописного текста:

//Start connection with message controller
  public startConnectionMessage = () => {
    this.hubMessageConnection = new signalR.HubConnectionBuilder()
      .configureLogging(signalR.LogLevel.Debug)
      .withUrl('http://localhost:20000/notifications')
      .build();

    this.hubMessageConnection
      .start()
      .then(() => {
        //after connection started
        console.log('Notifications Service connection started!');

        // Start the Group Listener.
        this.addTranferGroupMessageListener();

        // Get ConnectionID.
        this.GetConnectionID();

      })
      .catch(err => console.log('Error while starting connection: ' + err))
  }

// Group channel listner.
  public addTranferGroupMessageListener = () => {
    this.hubMessageConnection.on("groupMessage", (data: any) => {
      console.log(data);
    });
  }

  private GetConnectionID() {
    this.hubMessageConnection.invoke("GetConnectionID")
      .then((connectionID: string) => {
        console.log("Recived connectionID = " + connectionID);

        // call the method to register AppContextData.
        this.sendApplicationContextData(connectionID)

      }).catch((error: Error) => {
        console.log("Error: " + error);
      })
  }

private sendApplicationContextData(connectionID: string) {
    // add the received connectionID to the payload.
    this.connection.ConnectionID = connectionID;

    console.log("Sending ApplicationData.");
    console.log(this.connection);

    //inovke server side method to pass AppContext data.
    this.hubMessageConnection.invoke("RegisterAppContextData", this.connection)
      .then()
      .catch((error: Error) => {
        console.log("Error: " + error);
      });
  }

Вы видите, что после установления соединения яВызовите метод-концентратор, который просто возвращает мне connectionID, и на основе ConnectionID я вызываю другой метод, отправляющий этот параметр. Методы концентратора на стороне сервера:

public string GetConnectionID()
{
  return this.Context.ConnectionId;
}

public async Task RegisterAppContextData(AppContextData data)
{
    // Calls the groups Manager.
    await this.MapClientToGroups(data);
}
...