访问Azure App Service托管的SignalR Hub时遭遇CORS错误如何解决?
问题描述
我有一个部署在Azure App Service上的.NET Core WebAPI,集成了SignalR Hub。客户端托管在Azure Static Web App,调用后端服务和Hub的SSL通信一切正常,但客户端尝试与SignalR Hub建立连接时触发CORS错误:
从源'https://client-app.5.azurestaticapps.net'访问'https://backend-service.azurewebsites.net/hub/shop/negotiate?negotiateVersion=1'时被CORS策略阻止:预检请求的响应未通过访问控制检查:响应中的'Access-Control-Allow-Credentials'标头值为'',而当请求的凭据模式为'include'时必须为'true'。
(Chrome错误截图:
)
该服务此前运行状态良好,未对任何内容进行修改的情况下突然出现此错误。
解决方案
1. 修正.NET Core代码中的CORS策略
确保在Program.cs(.NET 6+)或Startup.cs中配置的CORS策略包含AllowCredentials(),并明确指定客户端源:
// .NET 6+ 示例代码 builder.Services.AddCors(options => { options.AddPolicy("SignalRCorsPolicy", policy => { policy.WithOrigins("https://client-app.5.azurestaticapps.net") .AllowAnyHeader() .AllowAnyMethod() .AllowCredentials(); // 必须添加此配置,对应允许凭据 }); }); // 注意中间件顺序:UseCors要放在UseRouting之后,UseEndpoints之前 app.UseCors("SignalRCorsPolicy"); app.MapHub<ShopHub>("/hub/shop");
2. 检查Azure App Service门户的CORS配置
Azure App Service的门户CORS设置会覆盖代码中的配置,需确认:
- 在App Service控制台的配置 > CORS页面,已将
https://client-app.5.azurestaticapps.net添加到允许的源列表 - 勾选启用凭据选项(此选项控制
Access-Control-Allow-Credentials标头为true)
若之前未勾选,可能是Azure后台配置自动变更导致问题,勾选后保存并重启App Service。
3. 验证SignalR客户端连接配置
确认客户端连接时设置了正确的凭据模式,避免不匹配:
// JavaScript客户端示例 const connection = new signalR.HubConnectionBuilder() .withUrl("https://backend-service.azurewebsites.net/hub/shop", { withCredentials: true // 此设置会触发请求凭据模式为include,后端必须允许 }) .build();
4. 排查Azure平台自动更新的影响
Azure App Service可能自动升级.NET Core运行时或平台组件,导致CORS行为变化:
- 重启App Service实例,排除临时配置异常
- 在配置 > 常规设置中检查.NET Core版本,若有自动升级,可尝试回滚到之前的稳定版本测试
内容的提问来源于stack exchange,提问作者cesAR
相关产品推荐
相关产品推荐

