.NET SignalR客户端无法通过任何传输方式连接服务器求助
SignalR WebSocket连接故障排查方案
核心排查方向
结合本地正常、Azure虚拟机+ngrok异常、Postman可连接的场景,重点排查以下几点:
1. IIS Express与ngrok转发配置
- 确认ngrok转发端口与IIS Express监听端口完全匹配,同时修改
.vs/config/applicationhost.config,将IIS Express的绑定地址从localhost改为*或虚拟机公网IP,允许远程连接。 - 查看ngrok日志,确认SignalR的所有传输请求都被正确转发到IIS Express,无拦截或路由错误。
2. SignalR专属CORS配置
SignalR对CORS有特殊要求,即使常规配置正确也需核对:
- 禁止
AllowAnyOrigin()与AllowCredentials()搭配使用,需明确指定客户端源地址:services.AddCors(options => { options.AddPolicy("SignalRCors", policy => { policy.WithOrigins("https://your-client-domain", "http://localhost:3000") .AllowAnyMethod() .AllowAnyHeader() .AllowCredentials(); }); }); - 确保SignalR端点绑定CORS策略:
app.UseCors("SignalRCors"); app.UseRouting(); app.UseEndpoints(endpoints => { endpoints.MapHub<YourHub>("/hub-path").RequireCors("SignalRCors"); });
3. 传输方式与网络限制
- 检查Azure虚拟机防火墙/安全组,确认开放了WebSocket默认端口(80/443),且Windows功能中已启用「WebSocket协议」。
- 强制客户端仅使用WebSocket传输,排除其他方式干扰:
const connection = new signalR.HubConnectionBuilder() .withUrl("https://your-ngrok-address/hub-path", { transport: signalR.HttpTransportType.WebSockets }) .build();
4. Autodesk Forge回调适配
- 确认Forge服务器的回调地址为ngrok公网地址,且该地址已加入CORS允许源列表。
- 检查Forge回调请求是否携带SignalR要求的
Connection-Token等参数,避免被服务器拦截。
5. 日志调试
- 开启服务器端SignalR详细日志,获取连接失败具体原因:
// appsettings.json { "Logging": { "LogLevel": { "Microsoft.AspNetCore.SignalR": "Debug", "Microsoft.AspNetCore.Http.Connections": "Debug" } } } - 客户端添加错误日志:
connection.onclose(error => console.error("连接关闭错误:", error)); connection.start().catch(err => console.error("启动失败:", err));
代码检查点
Startup.cs关键配置
- 已添加SignalR服务:
services.AddSignalR(); - 已启用WebSocket中间件:
app.UseWebSockets();(ASP.NET Core 3.0+虽自动启用,手动添加更稳妥) - CORS配置在
UseRouting()前调用,且SignalR端点绑定了对应策略。
客户端关键检查
withUrl使用ngrok公网地址,而非localhost- 无错误的请求头或凭据配置
内容的提问来源于stack exchange,提问作者gmad
相关产品推荐
相关产品推荐

