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