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