排查连接错误

本部分可帮助排查尝试与 ASP.NET Core SignalR 中心建立连接时可能发生的错误。

响应代码 404

使用 WebSocket 且 skipNegotiation = true

WebSocket connection to 'wss://xxx/HubName' failed: Error during WebSocket handshake: Unexpected response code: 404
  • 在无粘滞会话的情况下使用多台服务器时,连接可能会在一台服务器上启动,然后切换到另一台服务器。 另一台服务器不知道先前的连接。

  • 验证客户端是否连接到正确的终结点。 例如,服务器托管在 http://127.0.0.1:5000/hub/myHub 上,并且客户端尝试连接到 http://127.0.0.1:5000/myHub

  • 如果连接使用 ID,并且在协商后向服务器发送请求的时间过长,服务器将:

    • 删除 ID。
    • 返回 404。

响应代码 400 或 503

对于以下错误:

WebSocket connection to 'wss://xxx/HubName' failed: Error during WebSocket handshake: Unexpected response code: 400

Error: Failed to start the connection: Error: There was an error with the transport.

此错误通常是由客户端仅使用 WebSocket 传输但未在服务器上启用 WebSocket 协议引起的。

响应代码 307

使用 WebSocket 且 skipNegotiation = true

WebSocket connection to 'ws://xxx/HubName' failed: Error during WebSocket handshake: Unexpected response code: 307

此错误也可能在协商请求期间发生。

常见原因:

  • 应用配置为通过在 Startup 中调用 UseHttpsRedirection 来强制实施 HTTPS,或通过 URL 重写规则强制实施 HTTPS。

可能的解决方案:

  • 将客户端的 URL 从“http”更改为“https”。 .withUrl("https://xxx/HubName")

响应代码 405

Http 状态代码 405 - 不允许使用方法

  • 应用未启用 CORS

响应代码 0

Http 状态代码 0 - 通常是 CORS 问题,未提供状态代码

Cross-Origin Request Blocked: The Same Origin Policy disallows reading the remote resource at http://localhost:5000/default/negotiate?negotiateVersion=1. (Reason: CORS header 'Access-Control-Allow-Origin' missing).
  • 将预期来源添加到 .WithOrigins(...)
Cross-Origin Request Blocked: The Same Origin Policy disallows reading the remote resource at http://localhost:5000/default/negotiate?negotiateVersion=1. (Reason: expected 'true' in CORS header 'Access-Control-Allow-Credentials').
  • .AllowCredentials() 添加到 CORS 策略。 不能将 .AllowAnyOrigin().WithOrigins("*") 与此选项一起使用

响应代码 413

Http 状态码 413 - 有效负载太大

这通常是由超过 4k 的访问令牌引起的。

  • 如果使用 Azure SignalR 服务,请使用以下命令自定义通过该服务发送的声明,从而减小令牌大小:
.AddAzureSignalR(options =>
{
    options.ClaimsProvider = context => context.User.Claims;
});

暂时性网络故障

暂时性网络故障可能会关闭 SignalR 连接。 服务器可能会将关闭的连接解释为正常的客户端断开连接。 若要详细了解客户端在这些情况下断开连接的原因,请从客户端和服务器收集日志