SignalR协商阶段发生了CORS错误。

3

在从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个回答

0

您应该以这种方式配置 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));
    });
}

您可以在这里查看更详细的答案。


1
谢谢,我会尝试,但是我应该更新 Angular SignalR 包吗? - Vladyslav Furdak
1
@VladislavFurdak 客户端包已从@aspnet/signalr迁移到@microsoft/signalr,因此您应该将包升级到版本3.1.3:https://www.npmjs.com/package/@microsoft/signalr - Kiril1512
然后从 URI 中删除 ws - Kiril1512
请提供您的 Angular 代码以连接服务器。 - Kiril1512
1
你如何在客户端传递令牌?你有授权属性吗?就像我之前说的那样,请添加你的客户端代码。 - Kiril1512
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接