Khắc phục sự cố kết nối ASP.NET Core SignalR
Phần này cung cấp trợ giúp với các lỗi có thể xảy ra khi cố gắng thiết lập kết nối đến một SignalR hub (trung tâm SignalR).
Mã phản hồi (Response code) 404
WebSocket connection to 'wss://xxx/HubName' failed: Error during WebSocket handshake: Unexpected response code: 404
Nguyên nhân chung (tất cả cấu hình):
- Xác minh rằng client (máy khách) đang kết nối đến đúng endpoint (điểm cuối). Ví dụ: server được host tại
http://127.0.0.1:5000/hub/myHubnhưng client đang cố kết nối đếnhttp://127.0.0.1:5000/myHub.
Khi sử dụng luồng negotiate mặc định (skipNegotiation = false):
- Khi sử dụng nhiều server mà không có sticky sessions (phiên dính), kết nối có thể bắt đầu trên một server rồi chuyển sang server khác. Server kia không biết về kết nối trước đó.
- Nếu kết nối sử dụng ID và mất quá nhiều thời gian để gửi yêu cầu đến server sau khi negotiate, server sẽ:
- Xóa ID.
- Trả về mã 404.
Khi sử dụng WebSockets với skipNegotiation = true:
- Vì negotiate bị bỏ qua và không có connection ID (ID kết nối) được lấy từ
/negotiate, các tình huống về sticky session và timeout của connection ID không áp dụng. Mã 404 trong trường hợp này thường có nghĩa là URL endpoint của WebSocket không đúng hoặc hub chưa được ánh xạ (mapped) trên server.
Mã phản hồi 400 hoặc 503
Với lỗi sau:
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.
Lỗi này thường do client chỉ sử dụng transport (giao thức truyền tải) WebSockets nhưng giao thức WebSocket chưa được bật trên server.
Mã phản hồi 307
Khi sử dụng WebSockets và skipNegotiation = true
WebSocket connection to 'ws://xxx/HubName' failed: Error during WebSocket handshake: Unexpected response code: 307
Lỗi này cũng có thể xảy ra trong quá trình yêu cầu negotiate.
Nguyên nhân phổ biến:
- Ứng dụng được cấu hình để bắt buộc HTTPS bằng cách gọi
UseHttpsRedirectiontrongStartup, hoặc bắt buộc HTTPS thông qua quy tắc URL rewrite (viết lại URL).
Giải pháp có thể:
- Thay đổi URL ở phía client từ "http" thành "https".
.withUrl("https://xxx/HubName")
Mã phản hồi 405
HTTP status code (mã trạng thái HTTP) 405 - Method Not Allowed (Phương thức không được phép)
- Ứng dụng không bật CORS (Cross-Origin Resource Sharing - Chia sẻ tài nguyên đa nguồn gốc)
Mã phản hồi 0
HTTP status code 0 - Thường là vấn đề CORS, không có mã trạng thái nào được cung cấp
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).
- Thêm các origin (nguồn gốc) mong đợi vào
.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').
- Thêm
.AllowCredentials()vào CORS policy (chính sách CORS) của bạn. Không thể sử dụng.AllowAnyOrigin()hoặc.WithOrigins("*")với tùy chọn này
Mã phản hồi 413
HTTP status code 413 - Payload Too Large (Tải trọng quá lớn)
Nguyên nhân thường gặp là access token (token truy cập) vượt quá 4k.
- Nếu đang sử dụng Azure SignalR Service, hãy giảm kích thước token bằng cách tùy chỉnh các claims (xác nhận quyền) được gửi qua Service:
.AddAzureSignalR(options =>
{
options.ClaimsProvider = context => context.User.Claims;
});Lỗi mạng tạm thời (Transient network failures)
Lỗi mạng tạm thời có thể đóng kết nối SignalR. Server có thể hiểu kết nối đã đóng như một client ngắt kết nối bình thường. Để biết thêm thông tin về lý do client bị ngắt kết nối trong những trường hợp này, hãy thu thập logs từ client và server.