在 IIS 8(启用 WebSocket)上托管的 SignalR dotnet 3.1 webapi 仅工作几分钟

SignalR dotnet 3.1 webapi hosted on IIS 8 (WebSocket enabled) works few minutes only

我在 IIS 8 上托管带有 SignalR 的 dotnet 3.1 WebApi,并在服务器上启用了 WebSocket 协议。托管的 API 应用程序在前几分钟运行良好,但在一段时间后停止工作并且不响应任何请求。

客户端在 Angular 11 中,它应该可以正常工作。但是发生这种情况时,客户端需要很长时间才能完成 API 请求。

并且必须重新启动应用程序然后再次运行几分钟。

IIS 日志显示此错误

System.InvalidOperationException: The 'InvokeCoreAsync' method cannot be called if the connection is not active

已搜索此错误,但目前没有任何效果。

控制器构造
/**
   Controller Constructure
**/
        private IDataTracker _iDataTracker;
        private HubConnection _signalRHubConnection;

        public DataTrackingController(IDataTracker iDataTracker){
            _iDataTracker = iDataTracker;
            if(_signalRHubConnection == null || _signalRHubConnection.State == HubConnectionState.Disconnected)
            {
                _signalRHubConnection = new HubConnectionBuilder()
                .WithUrl("http://locally-hosted-url/DataApi/dataHub")
                .WithAutomaticReconnect()
                .Build();
                _signalRHubConnection.StartAsync();
            }
        }
控制器操作
/**
  Controller Action
**/

[HttpPost]
public async Task<IActionResult> TrackDataAsync(DataModel dataObject){
      
      //database call
      var resultData = _iDataTracker.TrackData(dataObject);

      //SignalR Client call
      await _signalRHubConnection.InvokeAsync("SendData", dataObject);

      return Ok(resultData);
}
SignalR 中心

/**
  Hub class
**/

public class DataHub: Hub
    {
        public void SendData(DataModel dataObject)
        {
            Console.WriteLine("SignalR data: "+ dataObject.IQty);
            Clients.All.SendAsync("ReceiveData",dataObject);
        }

    }

谢谢,@lex-li 提到控制器实例的问题。所以现在 Hub 是用 IHubContext 实例化的,这显然解决了这里的问题。

/**
   Controller Constructure
**/
        private IDataTracker _iDataTracker;
        private readonly IHubContext<ProductionCountHub> _hubContext;

        public DataTrackingController(IDataTracker iDataTracker,  
                                IHubContext<ProductionCountHub> hubContext){
            _iDataTracker = iDataTracker;
            _hubContext = hubContext;
        }
/**
  Controller Action
**/

[HttpPost]
public async Task<IActionResult> TrackDataAsync(DataModel dataObject){
      
      //database call
      var resultData = _iDataTracker.TrackData(dataObject);

      //SignalR Client call
      await _hubContext.Clients.All.SendAsync("SendData", dataObject);

      return Ok(resultData);
}