在 SignalR 协商阶段发生 CORS 错误

Posted

技术标签:

【中文标题】在 SignalR 协商阶段发生 CORS 错误【英文标题】:The CORS error occurred on SignalR negotiation phase 【发布时间】:2020-03-27 11:58:56 【问题描述】:

从 Asp.net core 2.2 迁移到 3.1 后,控制台出现以下错误

Access to XMLHttpRequest at 'someuri/negotiate?negotiateVersion=1' from 
origin 'http://localhost:4208' 
has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested 
resource.

还有下面SignalR的配置:

app.UseCors(Constants.Policy);
app.UseAuthentication();

app.UseEndpoints(
          endpoints =>
          
             endpoints.MapHub<SomeHub>("/ws/someuri");
          );

我已添加以下政策:

options.AddPolicy(Constants.Policy,
                    p => 
                        p.AllowAnyHeader()
                       .AllowAnyMethod()
                       .AllowCredentials()
                       .WithOrigins("http://localhost:4208"));

但这并没有帮助。

【问题讨论】:

【参考方案1】:

你应该这样配置CORS,顺序是重要的!

关于你的配置方法:

public override void Configure(IApplicationBuilder app, HostConfiguration hostConfiguration, ILogger<Startup> logger)

    base.Configure(app, hostConfiguration, logger);

    app.UseWebSockets();

    app.UseCors(CorsPolicy); // first configure CORS, then map Hub

    app.UseEndpoints(endpoints =>
    
        endpoints.MapHub<SomeHub>("/someuri");
    );

那么在添加CORS的时候:

/// <summary>
/// Adds the CORS.
/// </summary>
private void AddCors(IServiceCollection services)

    services.AddCors(options =>
    
        options.AddPolicy(CorsPolicy, builder => builder.WithOrigins("http://localhost:4208")
            .AllowAnyHeader()
            .AllowAnyMethod()
            .AllowCredentials()
            .SetIsOriginAllowed((host) => true));
    );

你可以看到更详细的答案here。

【讨论】:

谢谢,我会尝试,但我应该更新 Angular SignalR 包吗?? @VladislavFurdak 客户端软件包已从 @aspnet/signalr 迁移到 @microsoft/signalr,因此您应该将软件包升级到版本 3.1.3:npmjs.com/package/@microsoft/signalr 然后从uri中删除ws 另外请添加您如何连接到服务器的角度代码。 如何在客户端传递令牌?你有授权属性吗?正如我之前所说,请添加您的客户端代码。

以上是关于在 SignalR 协商阶段发生 CORS 错误的主要内容,如果未能解决你的问题,请参考以下文章

SignalR:协商请求期间出错:未定义

如何使用信号器允许 cors

在角度应用程序中使用 SignalR Core 时出现 CORS 错误

500 /signalr/negotiate 在 Azure 中部署的应用程序

协商后跨源 SignalR 连接停止

客户何时适合与 SignalR 服务重新协商?