Состояние подключения сигнала R через некоторое время равно 0

Я использую @aspnet/signalr для подключения к концентратору, и из концентратора я вызываю метод, чтобы вернуть мне некоторые данные.

Когда я впервые инициализирую сервер, соединение устанавливается нормально, но если я обновляю окно 3 или 4 раза, клиент перестает отправлять запрос на соединение на сервер.

Я попытался зарегистрировать HubConnection, connectionState сначала было равно 1, но после того, как проблема возникла, connectionState всегда равно 0

Вот как я создаю hubConnection:

buildConnection() {
this.hubConnection = new HubConnectionBuilder()
.withUrl(this.tradesService.getStockQuotationsHubUrl())
.build();
this.hubConnection.serverTimeoutInMilliseconds = 1000 * 10;
this.hubConnection.onclose(() => setTimeout(() => this.startSignalRConnection(), 2000));}

Вот как я запускаю hubConnection:

startConnection() {
    this.hubConnection
      .start()
      .then(() => {
      this.hubConnection.on('updateMethod', (data: any) => {
        
          this.store.push([
            { type: 'update', key: data.stockID, data },
          ]);
         
        });
      this.dataSource = new DataSource({
          store: this.store,
          reshapeOnPush: true,
        });
      });}

Примечание: я перечисляю на своей странице сразу 5 хабов, но проблемы возникают только у этого.

[Обновление]

Проблема связана с сервером, потому что, когда я перезапускаю сервер, соединение между клиентом и сервером восстанавливается, но если клиент обновляет или закрывает страницу несколько раз, концентратор даже не пытается подключиться к клиенту.

public class StockQuotationsHub : Microsoft.AspNetCore.SignalR.Hub
  {
    private string SectorID { get; set; }
    private int TradingSession { get; set; }
    private int MarketID { get; set; }

public static StockQuotationExt stockQuotationExt { get; set; }
private readonly StockQuotationTicker _stockTicker;

public StockQuotationsHub(StockQuotationTicker stockTicker){
    _stockTicker = stockTicker;
}

public override Task OnConnectedAsync(){
return base.OnConnectedAsync();
}

public IEnumerable<StockQuotation> GetAllStockQuotations(string[] stockID, string sectorID, int tradingSession, int marketType){
    return _stockTicker.
    GetAllStocks(Context.ConnectionId, stockID, sectorID, tradingSession, marketType);
        }

public override async Task OnDisconnectedAsync(Exception exception){
    await base.OnDisconnectedAsync(exception);
}

а вот мой класс биржевых тикеров:

public IEnumerable<StockQuotation> GetAllStocks(string connectionId, string[] stockID, string sectorID, int tradingSession, int marketType)
    {
        _stocks = new List<StockQuotation>();
        _stocks = Task.Run(async () => await GetStockQuotationModelAsync("", 0, 1, 0)).Result.ToList();
        this.MaxTimeStamp = _stocks.Max(s => s.TStamp);
        this.SectorID = sectorID;
        this.TradingSession = tradingSession;
        this.MarketID = marketType;

        AddToGroups(connectionId, stockID);

        if (_timer==null)
            _timer = new Timer(UpdateStockPrices, null, _updateInterval, _updateInterval);

        if (stockID.Length == 0)
        {
            return _stocks;
        }
        else
        {
            var stocksList = new List<StockQuotation>();
            foreach (var stock in stockID)
            {
                stocksList.AddRange(_stocks.Where(s => s.StockID == stock).ToList());
            }
            return stocksList;
        }
    }

private void AddToGroups(string connectionId, string[] stockID)
        {
            if (_stocks.Count > 0)
            {
                if (stockID.Length == 0)
                {
                    Hub.Groups.AddToGroupAsync(connectionId, "ALL");
                }
                else
                {
                    foreach (var stock in stockID)
                    {
                        Hub.Groups.AddToGroupAsync(connectionId, stock);
                        var s = _stocks.FirstOrDefault(s => s.StockID == stock);
                        if(s != null)
                        {
                        s.Snapshots = new List<double>(GetStockQuotationSnapshots(stock));
                        }
                    }
                }
            }
        }
private void AddToGroups(string connectionId, string[] stockID)
        {
            if (_stocks.Count > 0)
            {
                if (stockID.Length == 0)
                {
                    Hub.Groups.AddToGroupAsync(connectionId, "ALL");
                }
                else
                {
                    foreach (var stock in stockID)
                    {
                        Hub.Groups.AddToGroupAsync(connectionId, stock);
                        var s = _stocks.FirstOrDefault(s => s.StockID == stock);
                        if(s != null)
                        {
                        s.Snapshots = new List<double>(GetStockQuotationSnapshots(stock));
                        }
                    }
                }
            }
        }

Я очень признателен за помощь.


person Kardon63    schedule 17.07.2020    source источник
comment
Прежде всего, обновите свой пакет с @aspnet/signalr до @microsoft/signalr, поскольку это новый пакет, а старый сейчас не поддерживается.   -  person Kiril1512    schedule 17.07.2020
comment
Вы разрушаете соединение из-за перехвата ngDestroy? Если нет, вы пытаетесь его уничтожить.   -  person pc_coder    schedule 17.07.2020
comment
мне позвонить this.hubConnection.stop() или просто this.hubConnection = null?   -  person Kardon63    schedule 17.07.2020
comment
@ Kiril1512 спасибо за предложение, я обновился до @microsoft/signalr, но проблема все та же   -  person Kardon63    schedule 17.07.2020
comment
@ Kardon63: да, это не решит проблему, но, по крайней мере, вы используете последнюю версию SignalR, и теперь вы также можете использовать функцию AutomaticReconnect.   -  person Kiril1512    schedule 17.07.2020


Ответы (2)


В конце концов проблема заключалась в том, что тип проекта был MVC, поэтому я изменил его на webApi, и все сработало успешно.

person Kardon63    schedule 11.01.2021

Даже если вы исправите это, я бы порекомендовал вам добавить следующий код, чтобы точно знать основную причину отключения.

Прежде всего, включите расширенную информацию об отладке в конфигурации службы:

services.AddSignalR(o =>
            {
                o.EnableDetailedErrors = true;
            });

Кроме того, вам нужно прикрепить к событию Closed в HubConnection вот так:

hubConnection.Closed += (exception) =>
            {
                if (exception == null)
                {
                    Console.WriteLine("Connection closed without error.");
                }
                else
                {
                    Console.WriteLine($"Connection closed due to an error: {exception}");
                }
                return null;
            };
person Daniel Fuentes    schedule 11.01.2021