Обратные вызовы клиента SignalR Javascript не запускаются - PullRequest
0 голосов
/ 10 октября 2018

Я могу подключиться к своему концентратору, и я подключил OnConnected и OnDisconnected.Они должны добавить / вычесть из целого числа и вызвать обратный вызов клиента с новым значением.Мое угловое приложение успешно подключается к серверу, но моя зарегистрированная функция обратного вызова не запускается.

Вот мой серверный концентратор:

[HubName("online")]
public class OnlineHub : Hub
{
    private static int userCount = 0;

    public override Task OnConnected()
    {
        userCount++;
        Clients.All.listUpdated(userCount);

        return base.OnConnected();
    }

    public override Task OnDisconnected(bool stopCalled)
    {

        userCount--;

        Clients.All.listUpdated(userCount);

        return base.OnDisconnected(stopCalled);
    }
}

А вот мой Angular SignalRService:

import { AppSettings } from './../app.settings';
import { EventEmitter, Injectable, OnDestroy } from '@angular/core';

declare const $: any;

@Injectable()
export class SignalRService {

  // Declare the variables
  private onlineHub: any;
  // create the Event Emitter
  public messageReceived: EventEmitter<any>;
  public connectionEstablished: EventEmitter<Boolean>;
  public connectionExists: Boolean;

  constructor(private appSettings: AppSettings) {
    // Setup
    this.connectionEstablished = new EventEmitter<Boolean>();
    this.messageReceived = new EventEmitter<any>();
    this.connectionExists = false;
  }

  // This method gets executed from angular controller
  public initialize(proxyName: string): void {
    this.onlineHub = $.connection.online;

    this.onlineHub.client.listUpdated = function(list: any): void {
      console.log(list);
      this.messageReceived.emit(list);
    };

    this.startConnection();
  }

  private startConnection(): void {
    $.connection.hub.url = this.appSettings.SIGNALR_BASE_URL + '/signalr';
    $.connection.hub.start()
      .done((data: any) => {
        console.log('SignalR Connected with: ' + data.transport.name);
        this.connectionEstablished.emit(true);
        this.connectionExists = true;
      })
      .fail((error: any) => {
        console.log('SignalR could not connect: ' + error);
        this.connectionEstablished.emit(false);
      });
  }

  private registerOnServerEvents() {
    this.onlineHub.client.listUpdated = function(list: any): void {
      console.log(list);
      this.messageReceived.emit(list);
    };
  }
}

Я регистрирую свой обратный вызов "listUpdated" перед тем, как запустить start (), как сказано в документации, и $ .connection.hub содержит client.listUpdated до вызова start (), поэтому он должен зарегистрироваться.Но все же метод OnConnected не вызывается.

1 Ответ

0 голосов
/ 11 октября 2018

Я исправил эту проблему, заключив код OnConnected () и OnDisconnected () в блок try / catch, и создал метод на стороне клиента с именем «error», который возвращает возможные исключения клиенту.Таким образом я обнаружил, что у меня возникла проблема с сериализацией Json.

Мой концентратор теперь выглядит так:

    [HubName("online")]
    public class OnlineHub : Hub
    {
        private static int userCount = 0;


        public override Task OnConnected()
        {
            try
            {
                userCount++;
                Clients.All.listUpdated(userCount);

            }
            catch (Exception exc)
            {
                Clients.All.error(exc);
            }

            return base.OnConnected();
        }

        public override Task OnDisconnected(bool stopCalled)
        {
            try
            {
                userCount--;
                Clients.All.listUpdated(userCount);
            }
            catch (Exception exc)
            {
                Clients.All.error(exc);
            }

            return base.OnDisconnected(stopCalled);
        }
    }

И я регистрирую ответный вызов с ошибкой на клиенте js ДО вызова start ():

this.onlineHub.client.error = (exc: any): void => {
  console.log('Error occured:', exc);
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...