.NET Core 3.1 SignalR跨域(CORS)问题求助
.NET Core 3.1 SignalR跨域错误解决方案
错误原因分析
报错核心是:当请求的凭证模式(credentials mode)为include时,CORS响应头Access-Control-Allow-Origin不能使用通配符*。在.NET Core 3.1中,SignalR默认会在请求中携带凭证(如Cookie),而你当前的CORS策略用了AllowAnyOrigin()(对应通配符*),触发浏览器的跨域拦截。
具体修复步骤
1. 修改CORS策略配置
将原有的通配符允许源改为指定具体前端地址,并添加允许凭证的配置:
var corsBuilder = new CorsPolicyBuilder(); // 替换为你的前端实际地址,多个源可传入多个字符串参数 corsBuilder.WithOrigins("http://XXX:8080") .AllowAnyMethod() .AllowAnyHeader() .AllowCredentials(); // 必须添加,允许请求携带凭证 services.AddCors(opt => { opt.AddPolicy("AnotherPolicy", corsBuilder.Build()); });
2. 移除Hub类上冗余的CORS特性
你已经在MapHub时通过.RequireCors("AnotherPolicy")指定了CORS策略,Hub类及方法上的[EnableCors]属于重复配置,可能引发冲突,直接删除:
public class TestHub : Hub { IHubContext<TestHub> _hubContext = null; private static bool _firstTime = true; public TestHub(IHubContext<TestHub> hubContext) { if (_firstTime) { _firstTime = false; } _hubContext = hubContext; Task.Run(() => { Thread.Sleep(10000); Update(null,1); }); } public void Update(object sender, ushort participantId) { _hubContext.Clients.All.SendAsync("test", participantId); } }
3. (可选)客户端凭证配置(按需调整)
如果你的业务场景不需要携带凭证,可在客户端连接时显式关闭:
let _managerHub = new HubConnectionBuilder() .withUrl(Url + `/managerhub`, { withCredentials: false }) .configureLogging(LogLevel.Information) .build();
推荐优先调整服务端配置,保持SignalR的默认凭证行为。
验证
重启后端服务和前端应用,重新建立SignalR连接,跨域错误应该会消失。
内容的提问来源于stack exchange,提问作者ATT
相关产品推荐
相关产品推荐

