角度 SignalR 经常断开连接并显示错误状态代码 1006

Posted

技术标签:

【中文标题】角度 SignalR 经常断开连接并显示错误状态代码 1006【英文标题】:angular SignalR frequently disconnect with error status code 1006 【发布时间】:2021-07-18 09:44:14 【问题描述】:

我在使用 signalR 时遇到了一些问题,但我找不到问题所在。 我可以建立连接并获取事件,但客户端会随机断开连接并出现此错误:“错误:连接断开并出现错误‘错误:Websocket 已关闭,状态码为:1006()。’”

我在 angular 和 AspNetCore .core 5 SignalR 上使用 @microsoft/signalr 版本 5.0.8。 该网站托管在 IIS 10 中。

客户端代码:

createSignalrConnection()
 var comp = this;
 this.signalR = new signalR.HubConnectionBuilder()
      .withUrl(environment.signalrEndpoint + "/triggers")
      .withAutomaticReconnect()
      .build();

  
      this.signalR.start();

      this.signalR.onreconnecting(error=>
        console.log(error.toString(), " reconnect..");
      );

      this.signalR.on('TriggerMessage', (message: string)=>
        try
          comp.eventManager.emit("triggerEvent", machine);
        
        catch(err)
        
          console.log(err.toString());
        
      );

服务器端代码:

Startup.cs

public void ConfigureServices(IServiceCollection services)

  services.AddSignalR(hubOptions =>
  
    hubOptions.EnableDetailedErrors = true;
  );



public void Configure(IApplicationBuilder app, ILoggerFactory loggerFactory)
 app.UseEndpoints(endpoints =>
 
    endpoints.MapHub<TriggersHub>("/triggers");
 );

TriggersHub.cs

public class TriggersHub: Microsoft.AspNetCore.SignalR.Hub

   public async Task SendMessage(MachineJitData message)
   
     await Clients.All.SendAsync("TriggerMessage", JsonConvert.SerializeObject(message));
   

EventsController.cs

 public class EventsController
    
        protected ILoggerService _logger  get; 
        protected AppSettings _appSettings  get; 
        protected IDataService _dataService  get; 
        protected IHubContext<TriggersHub> _hubContext  get; 
        public EventsController(IOptions<AppSettings> appSettings, ILoggerService logger, IDataService dataService, IHubContext<TriggersHub> hubContext) : base(appSettings)
        
            _appSettings = appSettings.Value;
            _logger = logger;
            _dataService = dataService;
            _hubContext = hubContext;
        

        [HttpPost]
        [Route("data-trigger")]
        public async Task GetMonitorRefreshTrigger([FromBody] MachineJitData data)
        
            var new_jit_data = await _dataService.UpdateMachineJitData(data);
            await _hubContext.Clients.All.SendAsync("TriggerMessage", JsonConvert.SerializeObject(new_jit_data, new JsonSerializerSettings()  ContractResolver = new CamelCasePropertyNamesContractResolver() ));
        

【问题讨论】:

这能回答你的问题吗? getting the reason why websockets closed with close code 1006 【参考方案1】:

而对于这个问题,我们需要知道当 chrome 不符合 websocket 标准时,它会显示这个错误。因此,您可以尝试通过websocket.onerror(evt) 查找更多详细信息。但有时chrome不会向javascript端报告任何关闭代码1006的原因。你也可以使用火狐来做这个操作,火狐可以将细节上报给Javascript端。

更多详情也可以参考cmets中提到的this post@Ori。

对了,如果你用的是nginx,也可以试试为proxy_read_timeout设置一个long time值。

【讨论】:

您好!我尝试按照您的建议在 Firefox 上对其进行调试,结果如下: optimizer.js:99:44: 到 wss://some.url.com/triggers?id=WQeYB5Ek2WL0RuiCJ3ipCA 的连接在页面加载时中断。 @Ori 你能试试这个post的解决方案吗。

以上是关于角度 SignalR 经常断开连接并显示错误状态代码 1006的主要内容,如果未能解决你的问题,请参考以下文章

SignalR:检测客户端上的连接状态

如何确定与 SignalR 客户端的服务器断开连接?

选项卡背景化后每隔几分钟 SignalR 断开连接

Signalr 带有角度和 .net 核心错误,代码为 1006

断开连接后django通道无效状态错误

SignalR Asp.netcore 和 angular(WebSocket 未处于 OPEN 状态)断开信号R.HttpTransportType.WebSockets