相关文章推荐
安静的香烟  ·  viocli update MariaDB ...·  1 年前    · 
博学的煎饼  ·  Analysis Services ...·  1 年前    · 

本部分可帮助排查尝试与 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 连接。 服务器可能会将关闭的连接解释为正常的客户端断开连接。 若要详细了解客户端在这些情况下断开连接的原因,请从客户端和服务器收集日志

  • SignalR 中心协议
  •