一段时间后信号器连接状态为 0

Signal R connection state is 0 after sometime

我正在使用 @aspnet/signalr 连接到集线器,我正在从集线器调用该方法 return 我一些数据。

当我第一次初始化服务器时,连接是正常建立的,但是如果我刷新 window 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);
}

这是我的股票代码 class:

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));
                        }
                    }
                }
            }
        }

非常感谢您的帮助。

最终问题是项目类型是MVC,所以我把它改成了webApi 一切顺利

即使你修好了,我还是建议你添加以下代码,以便准确了解断开连接的根本原因。

首先在服务配置中启用扩展调试信息:

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

此外,您需要像这样附加到 HubConnection 中的 Closed 事件:

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