You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 07:14:57