SignalR 获取的访问已被 CORS 阻止

Posted

技术标签:

【中文标题】SignalR 获取的访问已被 CORS 阻止【英文标题】:SignalR Access to fetch has been blocked by CORS 【发布时间】:2021-09-29 04:04:14 【问题描述】:

我目前关注this basic signal R tutorial。 但是因为我想在现有项目中使用它,所以我将其拆分。 Hub 位于与客户端不同的项目中。因此IP地址不同。在 Hub 的配置中,我当然启用了 cors:

    public void ConfigureServices(IServiceCollection services)
    
                    services.AddCors();
                    services.AddControllers();
                    services.AddSignalR();
                    //other configuration code
    
    
    public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
            app.UseRouting();

            app.UseCors(x => x
           .AllowAnyMethod()
           .AllowAnyHeader()
           .AllowAnyOrigin()
        );

        app.UseEndpoints(endpoints =>
        
            endpoints.MapControllers();
            endpoints.MapHub<LiveUpdating.ChatHub>("/chatHub");
        );
    

但是,当我现在尝试连接到客户端中的 chatHub 时(设置与上面链接中的完全相同,只是我将连接更改为 var connection = new signalR.HubConnectionBuilder().withUrl("https://localhost:44316/chatHub").build(); )我收到此错误:

     Access to fetch at 'https://localhost:44316/chatHub/negotiate?negotiateVersion=1' from 
     origin 'https://localhost:44341' has been blocked by CORS policy: Response to preflight 
     request doesn't pass access control check: The value of the 'Access-Control-Allow-Origin' 
     header in the response must not be the wildcard '*' when the request's credentials mode 
     is 'include'.

当我添加 app.UseCors 时,这是否正常工作,如上所示。因为对于我所有其他的 Rest Controller,它都可以正常工作。

【问题讨论】:

您是否尝试将.AllowCredentials() 添加到您的保单中? 完全忘记了那个,谢谢。它有效,但我必须用 .SetIsOriginAllowed(origin => true) 替换 .AllowAnyOrigin() 才能仍然允许 anyOrigin 【参考方案1】:

将 app.useCors 替换为

            app.UseCors(x => x
           .AllowAnyMethod()
           .AllowAnyHeader()
           .SetIsOriginAllowed(origin => true)
           .AllowCredentials());

修复错误

【讨论】:

以上是关于SignalR 获取的访问已被 CORS 阻止的主要内容,如果未能解决你的问题,请参考以下文章

已被 CORS 策略阻止:没有“访问控制允许来源”

如何修复“评估已被 CORS 政策阻止:反应中没有“访问控制允许来源”

本地主机已被 cors 策略请求标头字段内容类型阻止访问控制不允许

Angular 和播放框架从源访问 XMLHttpRequest 已被 CORS 策略阻止

从源“https://www.reddit.com”获取 <my-google-cloud-function> 的访问权限已被阻止... CORS

CloudFront 已被 CORS 策略阻止