Azure部署后调用SignalR服务端SignIn方法报意外错误如何解决
Azure部署SignalR调用
SignIn方法报错解决 本地运行正常、部署到Azure后触发An unexpected error occurred invoking 'SignIn' on the server错误,本质是服务端Hub的SignIn方法执行时抛出了未捕获异常,前端拿到的是SignalR封装的通用错误提示,没有具体堆栈,按以下优先级排查:
- 第一步先获取服务端真实错误堆栈
进入Azure门户对应服务端Web App的「应用服务日志」页,开启文件系统类型的应用程序日志(临时排查保留期设1天即可),打开日志流后复现报错,直接从日志里定位SignIn方法内部具体的报错代码行,这是最快定位根因的方式,不要只盯着前端返回的通用错误猜问题。 - 核对Azure SignalR服务配置
确认服务端正确接入Azure SignalR服务,而非使用自托管SignalR配置:- 服务端Program/Startup配置里要在
AddSignalR()后追加AddAzureSignalR(),传入从Azure SignalR服务「密钥」页复制的完整连接字符串,不要遗漏AccessKey或者写错Endpoint
// Program.cs 正确配置示例 builder.Services.AddSignalR() .AddAzureSignalR(builder.Configuration.GetConnectionString("AzureSignalRConnection"));- 服务端CORS配置不能用通配符
*,要把客户端Web App的正式域名(带https前缀,不带尾斜杠)加入允许源列表,同时开启AllowCredentials,本地localhost环境默认不触发跨域严格校验,跨站点部署后CORS配置错误会直接导致方法调用失败。
- 服务端Program/Startup配置里要在
- 核对Azure SQL Database访问配置
本地开发环境通常因为客户端出口IP在SQL防火墙白名单里可以正常访问,部署后服务端Web App的出站IP没有加入Azure SQL防火墙规则,会导致SignIn方法内的数据库操作直接抛连接失败错误:- 到服务端Web App的「属性」页,复制所有列出的出站IP地址
- 进入Azure SQL的「防火墙和虚拟网络」页,把上述IP全部加入允许规则
- 核对服务端配置的SQL连接字符串为Azure SQL提供的正式连接串,不要保留本地开发用的
localhost、.\SQLEXPRESS等本地地址,确认连接串内的账号密码有对应数据库的读写权限。
- 核对方法内的环境依赖
检查SignIn方法内用到的配置项(第三方接口密钥、内部服务地址、文件读写路径)是否都在Azure Web App的「配置-应用程序设置」中正确配置,不要依赖本地机器的环境变量、本地磁盘绝对路径,Azure App Service默认对系统路径没有写权限,文件读写要使用应用服务专属的临时目录或挂载的存储资源。 - 反向代理配置校验
如果两个Web App前置了CDN、应用网关、Azure Front Door等反向代理,要确认代理已开启WebSocket支持,允许HTTP Upgrade头转发,使用HTTP/1.1协议转发SignalR相关请求,否则WebSocket连接会被代理拦截导致调用失败。

内容的提问来源于stack exchange,提问作者Ofek Ben Atar
相关产品推荐
相关产品推荐

